【问题标题】:Google Docs/Drive and Contacts OAuth 2.0 API access token not workingGoogle Docs/Drive 和 Contacts OAuth 2.0 API 访问令牌不起作用
【发布时间】:2015-01-29 09:01:37
【问题描述】:

我一直在尝试访问 Google Drive 和 Contacts OAuth 2.0 API,但没有任何效果。我已经获得了与here 相同的访问令牌。

我已分别指定https://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/contacts.readonly 作为Docs/Drive 和Contacts API 的范围(以编码URI 格式)。我为获取授权码而触发的 URL 是:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2callback&response_type=code&client_id=xxx&approval_prompt=force

然后我触发了一个 POST 请求以获取访问令牌。

我将 'Authorization' 标头下的访问令牌传递给 GET 请求:

Authorization: Bearer {access_token}

当我使用此访问令牌发出 API 请求时,我收到 500 Internal server 错误消息,JSON 响应如下:

{ "error": {  "code": 500,  "message": null }}.

请指导我完成这个。

【问题讨论】:

  • 指定你正在做的whar流程,服务器端还是客户端?

标签: google-drive-api google-oauth google-contacts-api


【解决方案1】:

如您所知,Oauth2 分为 3 个部分。

第 1 部分:请求访问权限

https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/contacts.readonly&response_type=code

这将向您的用户显示一个浏览器窗口,请求访问。然后他们将获得一个身份验证码。

第 2 部分:刷新令牌和访问令牌的交换身份验证代码

这是一个 Http 帖子

https://accounts.google.com/o/oauth2/token

code=4/X9lG6uWd8-MMJPElWggHZRzyFKtp.QubAT_P-GEwePvB8fYmgkJzntDnaiAI&client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code

你将得到的将是这样的:

{
"access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4"
}

第 3 部分刷新访问令牌: 访问令牌只能使用一个小时,因此一小时后您将需要使用刷新令牌来获取新的访问令牌

https://accounts.google.com/o/oauth2/token
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token

你会得到类似的东西

{
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
"token_type" : "Bearer",
"expires_in" : 3600
}

可以在Google 3 legged oauth2 flow 教程中找到有关所有这些工作原理的完整说明。这一切都只是从那里撕下来的。如果可能的话,您真的应该考虑为此使用客户端库。

将 Chrome 更新为 JavaScript:

JavaScript 不支持 type=offline,这会暴露刷新令牌。

解决方法:

  1. 使用 PHP 等服务器端语言生成和存储刷新令牌。
  2. 每次需要访问令牌时都请求它们。设置immediate=true 以便与用户没有可见的交互(阅读这应该可以工作,我从未尝试过)

【讨论】:

  • 嘿,我没有在响应中获得刷新令牌。你能说出为什么会这样吗?
  • 您使用什么语言发送您的 http 帖子?
  • 如果他使用的是 Chrome 扩展程序,将其称为 Javascript 并不完全正确,因为通常的浏览器问题不适用。 Google OAuth 服务器只看到 POST 请求,它们既不知道也不关心创建它们的语言。问题更可能是刷新令牌通常只在初始调用时返回,除非他指定 force=true。
  • @PriteshLahoti 您需要粘贴实际的 http 调用和响应,以便我们查看发生了什么。随意通过在最后交换/删除一些字符来混淆令牌,但让它们基本上可见,因为这有助于我们检查您是否在每次调用中使用了正确的代码/令牌。您还应该尝试使用 OAuth Playground 并将其 http 流量与您自己的进行比较。
  • 不要混淆 chrome 应用和 chrome 扩展。 chrome 应用程序与网站非常相似,并且您正在考虑的限制适用。可以授予 chrome 扩展程序执行几乎任何操作的权限。在这种情况下,OP 正在使用第三方 Chrome 扩展来完成大多数开发人员使用 curl 所做的事情,即。编写和发送任意 HTTP 请求。
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2015-04-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多