Google图书Oauth访问令牌授权错误

时间:2017-04-25 09:32:59

标签: ios swift xcode google-oauth google-books

您好我一直在开发一款可让用户使用Google Books API搜索图书的应用。一切都很好,直到我想访问用户最喜欢的书籍,添加和删除它们。错误是关于授权。 google books api在这里说要访问最喜欢的书籍

  

获取https://www.googleapis.com/books/v1/mylibrary/bookshelves?key=yourAPIKey   授权:/ * 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";
};
}

我正在使用Google登录sdk for iOS,以下是我尝试进行身份验证并成功完成的方法。

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()

登录成功,因为我看到成功登录后打印成功,并且我能够检索已登录用户的accessToken和idToken。 这是我打印的idToken。

已签名用户的ID令牌

  

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

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

1 个答案:

答案 0 :(得分:2)

选项1:

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

注意:密钥用于公共访问访问令牌是私有的,您只需要一个或其他

注2:您可以通过

进行测试
https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken

在任何网络浏览器中。

选项2:

标题应该是这样的

  

授权,Bearer accessToken

我认为你错过了持票人。

你不需要同时做这两件事都可以。

  

在“授权”请求标头中发送访问令牌时      由HTTP / 1.1 [RFC2617]定义的字段,客户端使用“承载”      用于传输访问令牌的身份验证方案。

     

授权:Bearer AccessToken

相关问题