Google 图书 Oauth 访问令牌授权错误
Google Books Oauth access token authorization error
您好,我一直在开发一个应用程序,让用户可以使用 Google 图书 API 搜索图书。一切正常,直到我想访问用户最喜欢的书,添加和删除它们。错误与授权有关。 google 本书 api 在这里说访问最喜欢的书 as
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";
};
}
我正在使用 Google 为 iOS 登录 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()
登录成功,因为我确实在成功登录时看到打印成功,而且我还能够检索登录用户的 accessToken 和 idToken。
这是我打印的 idToken。
登录用户的 ID 令牌
eyJhbGciOiJSUzI1NiIsImtpZCI6ImNiMDE1MDIxOWM5Y2NlZTBjY2Y3MDg2OTA4NmIxYjVmNGIzMGVmNWIifQ.eyJhenAiOiIxMDQ5NDc4MTExOTAwLTRxMm02MjNrajVtMGZldjdmYnFxOTN0azdyZ2p2czJmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiMTA0OTQ3ODExMTkwMC00cTJtNjIza2o1bTBmZXY3ZmJxcTkzdGs3cmdqdnMyZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjEwOTI5NDQ5ODE2OTA4NjY1OTU5NyIsImVtYWlsIjoic2FsbWFubWFqaWQxNEBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IlNMRzRoTGlrQXExZmQ2MnlnWklKR2ciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTMxMTE4NjAsImV4cCI6MTQ5MzExNTQ2MH0.Ct1aGjA6K8Vev_FmdjCj5hGJKyALY9jUcakbp4HSesarK8LHjEe2wZ1-8FR-FEyufIDTPENEkYpSXQRGYuHKXYmykNq6LMcRSWmR2JV8P5hDxwYPKcMwG4EgcvrEHncVBzjinn652mVHap6uBzwC4nvbpprpGKuglxZrqBKSobBthZnDitgyuMseWUq0lrfunNyA89g3KD9twjMMIDTMnP40u6if10T7P6JyedSoDgoOZ6rmhQOckovA1ery1rPl0zwvoRrbZ2GS_z-Zzz8ujhfyuxex-0yYExhVF09Gl4lvf5zySnSSbIGi6MIYaZC3W0-WaU4t0Hgho1kujl3ryw
请帮我解决这个问题。我整夜都在工作,无法解决这个问题。如果有更好的方法或者我可以解决这个问题,请告诉我。
选项 1:
URL(string: "https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken)")
注意:密钥用于public访问访问令牌是私有的你只需要一个
注意 2:您可以通过放置
来测试它
https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken
在任何网络浏览器中。
选项 2:
Header 应该是这样的
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
您好,我一直在开发一个应用程序,让用户可以使用 Google 图书 API 搜索图书。一切正常,直到我想访问用户最喜欢的书,添加和删除它们。错误与授权有关。 google 本书 api 在这里说访问最喜欢的书 as
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";
};
}
我正在使用 Google 为 iOS 登录 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()
登录成功,因为我确实在成功登录时看到打印成功,而且我还能够检索登录用户的 accessToken 和 idToken。 这是我打印的 idToken。
登录用户的 ID 令牌
eyJhbGciOiJSUzI1NiIsImtpZCI6ImNiMDE1MDIxOWM5Y2NlZTBjY2Y3MDg2OTA4NmIxYjVmNGIzMGVmNWIifQ.eyJhenAiOiIxMDQ5NDc4MTExOTAwLTRxMm02MjNrajVtMGZldjdmYnFxOTN0azdyZ2p2czJmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiMTA0OTQ3ODExMTkwMC00cTJtNjIza2o1bTBmZXY3ZmJxcTkzdGs3cmdqdnMyZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjEwOTI5NDQ5ODE2OTA4NjY1OTU5NyIsImVtYWlsIjoic2FsbWFubWFqaWQxNEBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IlNMRzRoTGlrQXExZmQ2MnlnWklKR2ciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTMxMTE4NjAsImV4cCI6MTQ5MzExNTQ2MH0.Ct1aGjA6K8Vev_FmdjCj5hGJKyALY9jUcakbp4HSesarK8LHjEe2wZ1-8FR-FEyufIDTPENEkYpSXQRGYuHKXYmykNq6LMcRSWmR2JV8P5hDxwYPKcMwG4EgcvrEHncVBzjinn652mVHap6uBzwC4nvbpprpGKuglxZrqBKSobBthZnDitgyuMseWUq0lrfunNyA89g3KD9twjMMIDTMnP40u6if10T7P6JyedSoDgoOZ6rmhQOckovA1ery1rPl0zwvoRrbZ2GS_z-Zzz8ujhfyuxex-0yYExhVF09Gl4lvf5zySnSSbIGi6MIYaZC3W0-WaU4t0Hgho1kujl3ryw
请帮我解决这个问题。我整夜都在工作,无法解决这个问题。如果有更好的方法或者我可以解决这个问题,请告诉我。
选项 1:
URL(string: "https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken)")
注意:密钥用于public访问访问令牌是私有的你只需要一个
注意 2:您可以通过放置
来测试它https://www.googleapis.com/books/v1/mylibrary/bookshelves?access_token=YourToken
在任何网络浏览器中。
选项 2:
Header 应该是这样的
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