无法刷新访问令牌:响应是"unauthorized_client"

Mar*_* V. 18 google-api oauth-2.0 google-api-java-client

我尝试刷新访问令牌时收到错误:

400错误请求

{error:"unauthorized_client"}

来自Google令牌URI:

{
  "error" : "invalid_request"
}
Run Code Online (Sandbox Code Playgroud)

在这里阅读了这个答案以及官方的Google文档(描述了POST请求应该如何看待),我没有看到任何区别.

我抓住了我的POST请求(删除了秘密):

POST /SHOWMERAWPOST HTTP/1.1
User-Agent: Google-HTTP-Java-Client/1.10.3-beta (gzip)
Pragma: no-cache
Host: requestb.in
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 175
Connection: keep-alive
Cache-Control: no-cache
Accept-Encoding: gzip
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

grant_type=refresh_token&refresh_token=******&client_id=*******.apps.googleusercontent.com&client_secret=******
Run Code Online (Sandbox Code Playgroud)

发送请求的Java代码:

RefreshTokenRequest req = new RefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(), new GenericUrl(
                    getSecrets().getDetails().getTokenUri()), REFRESH_TOKEN);

           req.set("client_id", getSecrets().getDetails().getClientId());
           req.set("client_secret", getSecrets().getDetails().getClientSecret());

           TokenResponse response = req.execute();
Run Code Online (Sandbox Code Playgroud)

有什么不对的吗?

Die*_*cic 27

问题解释

随着@MartinV的提示,我终于能够解决它了!因为他的答案并没有很好地解释如何解决它,我将在这里发布.

问题是因为我们都使用Google的OAuth Playground生成了刷新令牌,但是当您在第一步中单击"授权API"时,它会使用Playground应用程序进入精简屏幕.之后,您创建的所有令牌只能由Playground应用程序使用,但当然您不知道该应用程序的客户端ID或客户端密钥.

解决方案是让Playground使用您自己的客户端ID和密钥.为此,请单击"设置"按钮:

游乐场设置

并输入您的客户ID和密码.但是,在您这样做之前,您需要转到开发人员控制台,找到您的OAuth 2.0客户端ID客户端,对其进行编辑并在授权重定向URI下添加https://developers.google.com/oauthplayground.添加并保存更改后,返回操场并尝试授权API.在我的情况下,在授权重定向URI的更改生效之前花了15分钟.

完成后,不要忘记从开发者控制台中删除Playground URI!

额外

一旦我这样做了,在Python中我做了这个并且它有效:

access_token = None 
client_id = 'xxxxxxxx.apps.googleusercontent.com'
client_secret = 'xxxxxxxxxxxx'
refresh_token = 'xxxxxxxxxxxx'
token_expiry = None
token_uri = "https://accounts.google.com/o/oauth2/token"
user_agent = 'YourAgent/1.0'

credentials = client.GoogleCredentials(access_token, client_id, client_secret, refresh_token, token_expiry, token_uri, user_agent)

http = credentials.authorize(httplib2.Http())
credentials.refresh(http)

service = build('drive', 'v3', http=http)
req = service.files().list()
resp = req.execute(http=http)
Run Code Online (Sandbox Code Playgroud)

  • 天啊!我与这个问题斗争了好几天,直到我发现了这篇文章。谢谢你,这个答案应该被接受!@google 请更新您的文档。这不正常! (3认同)
  • 我的天啊!谢谢!!!! ....在审查了有关该主题的大量StackOverflow帖子,审阅了有关该主题的多个教程并将我的头发拉了一周多之后,试图弄清为什么我的编程请求刷新令牌失败了...这似乎已经解决了问题。我同意@ user1701153的观点,认为Google需要更好的文档……这真是太可怕了!啊! (2认同)

Mar*_* V. 11

我在OAuth2 playground中创建了访问和刷新令牌,然后我将它们复制到我的应用程序中.它不允许有自动化和令牌刷新的不同客户端.

  • 当您使用刷新令牌时,[clientid,screretid]生成此问题,这与[clientid,screredid]不同,用于授权过程. (12认同)
  • 它不允许有不同的客户端进行自动化和令牌刷新>> Martin你能解释一下吗...我面临类似的问题..谢谢. (3认同)