Google文档/云端硬盘和通讯录OAuth 2.0 API访问令牌无效

时间:2015-01-29 09:01:37

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

我一直在尝试访问Google云端硬盘和通讯录OAuth 2.0 API,但无效。我已经获得了与所述here相同的访问令牌。

我已分别指定https://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/contacts.readonly作为Docs / Drive和Contacts API的范围(采用encodedURI格式)。我为获取授权码而触发的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内部服务器错误消息,并且JSON响应为:

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

请指导我。

1 个答案:

答案 0 :(得分:0)

如你所知,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部分:刷新令牌和访问令牌的Exchange身份验证代码

这是一个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,以便与用户之间没有可见的交互(阅读本文应该可行,我从未尝试过)