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)
Mar*_* V. 11
我在OAuth2 playground中创建了访问和刷新令牌,然后我将它们复制到我的应用程序中.它不允许有自动化和令牌刷新的不同客户端.
| 归档时间: |
|
| 查看次数: |
27859 次 |
| 最近记录: |