(JAVA) Google API 分析 - 无法使用“刷新令牌”获取新的“访问令牌”
Posted
技术标签:
【中文标题】(JAVA) Google API 分析 - 无法使用“刷新令牌”获取新的“访问令牌”【英文标题】:(JAVA) Google API analytics - unable to obtain new "access token" using "refresh token" 【发布时间】:2012-10-26 18:25:39 【问题描述】:我想根据数据库中保存的“刷新令牌”获取新的“访问令牌”。
这是我写的代码:
GoogleCredential.Builder credentialBuilder = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET);
credentialBuilder.addRefreshListener(new MyCredentialRefreshListener());
credential = credentialBuilder.build();
credential.setRefreshToken("saved_refresh_token_from_database");
try
credential.refreshToken();
catch (IOException e)
e.printStackTrace();
class MyCredentialRefreshListener implements CredentialRefreshListener
public void onTokenResponse(Credential cr, TokenResponse tr)
System.out.println("Credential was refreshed successfully.");
public void onTokenErrorResponse(Credential cr, TokenErrorResponse tr)
System.out.println(tr);
我收到这条消息:
com.google.api.client.auth.oauth2.TokenResponseException: 400 错误
请求 "error" : "invalid_grant"
我在 php 脚本中使用相同的 CLIENT_ID、CLIENT_SECRET 和“刷新令牌”,当“访问令牌”过期时,我设法使用“刷新令牌”获取新的“访问令牌”。
我根据javadoc.google-oauth-java-client写了代码。
这里有人知道如何修改代码以获得新的访问令牌吗?
提前致谢。
更新:问题是我在数据库中保存了 refresh_token 而没有对其进行 json_decode 并且它包含一个“\”,它被认为是 JSON 中的转义字符。
【问题讨论】:
我试过你的代码,它对我有用。我认为这是您的刷新令牌的数据/格式问题。 【参考方案1】:您似乎发现了一些过时的文档。您链接的 JavaDoc 适用于客户端库的 1.8 版。当前版本是 1.12。
客户端库作者建议您使用GoogleAuthorizationCodeFlow
来管理您的 OAuth 凭据。它会自动处理刷新。如果您遵循此路径,代码将如下所示:
// Create the flow
AuthorizationCodeFlow authorizationCodeFlow = new GoogleAuthorizationCodeFlow.Builder(
new UrlFetchTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET,
Collections.singleton(OAUTH_SCOPES))
.setAccessType("offline")
.setCredentialStore(new AppEngineCredentialStore())
.build();
// User Id: e.g. from session
Credential credential = authorizationCodeFlow.loadCredential(USER_ID);
// Make your API call. This example uses the Google+ API
// If the access token has expired, it will automatically refresh
Plus plus = new Plus(new UrlFetchTransport(), new JacksonFactory(), credential)
.activities().list("me", "public").execute();
【讨论】:
【参考方案2】:如果您获得 http 状态 400,并且消息“invalid_grant”。 我认为您应该检查您的 HTTP_TRANSPORT、JSON_FACTORY、CLIENT_ID、CLIENT_SECRET 实例。
【讨论】:
以上是关于(JAVA) Google API 分析 - 无法使用“刷新令牌”获取新的“访问令牌”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用API 而不是使用Google BigQuery数据传输服务?
NetHttpTransport无法解析为Google api实现的类型