ios - Google Books Oauth 访问 token 授权错误

标签 ios swift xcode google-oauth google-books

您好,我一直在开发一款应用程序,让用户可以使用 Google Books API 搜索图书。一切正常,直到我想访问用户最喜欢的书,添加和删除它们。错误与授权有关。 google books api 在这里说访问最喜欢的书作为

GET https://www.googleapis.com/books/v1/mylibrary/bookshelves?key=yourAPIKey Authorization: /* auth token here */

我正在做的是这个。

var userId: String?
    if(UserStats.currentUser?.authentication.idToken != nil){
        userId = UserStats.currentUser?.authentication.idToken
    }
    guard let id = userId else{
        print("User Not authenticated")
        return
    }
    print("USer ID : \(id)")
    let theUrl = URL(string: "https://www.googleapis.com/books/v1/mylibrary/bookshelves?key=AIzaSyBIDJ50ak-caS3M-6nSVbxdN_SmssAlTRI)")
    if let url = theUrl{
        print("Search Called")
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = "GET"
        urlRequest.setValue(id, forHTTPHeaderField: "Authorization")
        print("URL : " + url.absoluteString)
        let task = URLSession.shared.dataTask(with: urlRequest, completionHandler: {
            (data, response, error) in

            if response != nil{
                if let res = response as? HTTPURLResponse{
                    if(res.statusCode == 408)
                    {
                        MessageBox.Show(message: "Error : Request TimeOut", title: "Error", view: self)
                    }

                }
            }

            if error != nil{
                print("Error \(error?.localizedDescription)")
                MessageBox.Show(message: (error?.localizedDescription)!, title: "An error occurred", view: self)

            }
            else{
                do{

                    let jsonData  = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                    print(jsonData)
                }catch{
                }
            }
        }
    }
}

每次我运行代码时都会出现错误。错误在这里

{
error =     {
    code = 401;
    errors =         (
                    {
            domain = global;
            location = Authorization;
            locationType = header;
            message = "Invalid Credentials";
            reason = authError;
        }
    );
    message = "Invalid Credentials";
};
}

我正在使用适用于 iOS 的 Google Sign in sdk,这是我尝试进行身份验证并成功完成的方式。

GIDSignIn.sharedInstance().delegate = self
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().clientID = "1049478111900-4q2m623kj5m0fev7fbqq93tk7rgjvs2f.apps.googleusercontent.com"
    GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/books")
GIDSignIn.sharedInstance().signIn()

登录成功,因为我在成功登录时确实看到了 Success 打印,而且我能够检索登录用户的 accessToken 和 idToken。 这是我打印的 idToken。

登录用户的 ID token

eyJhbGciOiJSUzI1NiIsImtpZCI6ImNiMDE1MDIxOWM5Y2NlZTBjY2Y3MDg2OTA4NmIxYjVmNGIzMGVmNWIifQ.eyJhenAiOiIxMDQ5NDc4MTExOTAwLTRxMm02MjNrajVtMGZldjdmYnFxOTN0azdyZ2p2czJmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiMTA0OTQ3ODExMTkwMC00cTJtNjIza2o1bTBmZXY3ZmJxcTkzdGs3cmdqdnMyZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjEwOTI5NDQ5ODE2OTA4NjY1OTU5NyIsImVtYWlsIjoic2FsbWFubWFqaWQxNEBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IlNMRzRoTGlrQXExZmQ2MnlnWklKR2ciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTMxMTE4NjAsImV4cCI6MTQ5MzExNTQ2MH0.Ct1aGjA6K8Vev_FmdjCj5hGJKyALY9jUcakbp4HSesarK8LHjEe2wZ1-8FR-FEyufIDTPENEkYpSXQRGYuHKXYmykNq6LMcRSWmR2JV8P5hDxwYPKcMwG4EgcvrEHncVBzjinn652mVHap6uBzwC4nvbpprpGKuglxZrqBKSobBthZnDitgyuMseWUq0lrfunNyA89g3KD9twjMMIDTMnP40u6if10T7P6JyedSoDgoOZ6rmhQOckovA1ery1rPl0zwvoRrbZ2GS_z-Zzz8ujhfyuxex-0yYExhVF09Gl4lvf5zySnSSbIGi6MIYaZC3W0-WaU4t0Hgho1kujl3ryw

请帮我解决这个问题。我整夜都在工作,无法解决这个问题。如果有更好的方法或者我可以解决这个问题,请告诉我。

最佳答案

选项 1:

URL(string: "https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken)")

注意: key 用于公共(public)访问访问 token 用于私有(private)你只需要一个或另一个

注2:你可以通过放置

来测试这个
https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken

在任何网络浏览器中。

选项 2:

标题应该是这样的

Authorization, Bearer accessToken

我认为你缺少承载。

您不需要同时执行这两个操作,一个都可以。

When sending the access token in the "Authorization" request header field defined by HTTP/1.1 [RFC2617], the client uses the "Bearer" authentication scheme to transmit the access token.

Authorization : Bearer AccessToken

关于ios - Google Books Oauth 访问 token 授权错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43606826/

相关文章:

ios - 找出一个函数执行需要多长时间(以秒为单位)

ios - 如何在iOS中显示来自JSON URL的图像?

ios - 我需要两个 TableViewController 吗?

xcodeproj 文件

ios - 点赞按钮并非每次都起作用

xcode - react 原生 clang : error: linker command failed with exit code 1

html - 将 Webview 窗口添加到加载本地存储的 HTML 的现有 iOS 应用程序

swift - IOS : Call can throw, 但没有标记为 'try' 错误未处理

ios - XCode swift : Adding new class variables to existing Class

swift - Realm Swift - 货币的数据类型