当前位置: 首页 > 知识库问答 >
问题:

(JAVA)Google API分析-无法使用“刷新令牌”获得新的“访问令牌”

颛孙钱青
2023-03-14

我想根据保存在数据库中的“刷新令牌”获得一个新的“访问令牌”。

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);
    }
 }

请求{“error”:“invalid_grant”}

我在php脚本中使用相同的CLIENT_ID、CLIENT_SECRET和“refresh token”,在“访问令牌”过期时,我设法使用“refresh token”获得新的“访问令牌”。

我基于javadoc.google-oauth-java-client编写了代码。

UPDATE:问题是我在数据库中保存refresh_token,而没有对它执行json_decode操作,它包含一个“\”,在JSON中被认为是转义字符。

共有1个答案

谢翰学
2023-03-14

看起来您可能发现了一些过时的文档。JavaDoc you链接用于客户端库的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();
 类似资料: