Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google drive api Google文档/驱动器和联系人OAuth 2.0 API访问令牌不工作_Google Drive Api_Google Oauth_Google Contacts Api - Fatal编程技术网

Google drive api Google文档/驱动器和联系人OAuth 2.0 API访问令牌不工作

Google drive api Google文档/驱动器和联系人OAuth 2.0 API访问令牌不工作,google-drive-api,google-oauth,google-contacts-api,Google Drive Api,Google Oauth,Google Contacts Api,我一直在尝试访问Google驱动器并联系OAuth 2.0 API,但没有效果。我已获得与上述相同的访问令牌 我指定了https://www.googleapis.com/auth/drive和https://www.googleapis.com/auth/contacts.readonly分别作为Docs/Drive和Contacts API的范围(encodedURI格式)。我为获取授权码而激发的URL是: https://accounts.google.com/o/oauth2/auth?

我一直在尝试访问Google驱动器并联系OAuth 2.0 API,但没有效果。我已获得与上述相同的访问令牌

我指定了
https://www.googleapis.com/auth/drive
https://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 }}.

请引导我完成此操作。

正如您所知,Oauth2由三部分组成

第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部分:为刷新令牌和访问令牌交换身份验证码

这是一篇HttpPost

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
}
关于所有这些工作原理的完整解释可以在教程中找到。所有这些都是从那上面扯下来的。如果可能的话,你真的应该考虑使用一个客户端库来实现这一点,因为它们使事情变得更容易

更新Chrome是JavaScript:

JavaScript不支持type=offline,这将公开刷新令牌

解决办法:

  • 使用服务器端语言(如PHP)生成并存储刷新令牌
  • 每次需要时请求访问令牌。设置为与用户没有可见的交互(阅读此内容,我从未尝试过)

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