Google drive api 使用Java从刷新令牌获取访问令牌

Google drive api 使用Java从刷新令牌获取访问令牌,google-drive-api,Google Drive Api,我使用这里给出的示例程序从授权代码中获得了刷新令牌和访问令牌 但是没有示例程序可以从刷新令牌(即,当我们没有授权代码时)获取访问令牌。有什么建议吗?是否有任何方法仅使用刷新令牌和访问令牌来实例化驱动器服务对象?此示例介绍了如何从Google App Engine数据存储中检索存储的凭据 如果使用其他类型的凭据存储,则可以使用以下代码使用存储的令牌实例化新的OAuth 2.0凭据: GoogleCredential credentials = new GoogleCredential.Builde

我使用这里给出的示例程序从授权代码中获得了刷新令牌和访问令牌

但是没有示例程序可以从刷新令牌(即,当我们没有授权代码时)获取访问令牌。有什么建议吗?是否有任何方法仅使用刷新令牌和访问令牌来实例化驱动器服务对象?

此示例介绍了如何从Google App Engine数据存储中检索存储的凭据

如果使用其他类型的凭据存储,则可以使用以下代码使用存储的令牌实例化新的OAuth 2.0凭据:

GoogleCredential credentials = new GoogleCredential.Builder()
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
    .setJsonFactory(jsonFactory).setTransport(transport).build()
    .setRefreshToken("<REFRESH_TOKEN>").setAccessToken("<ACCESS_TOKEN>");
GoogleCredential凭据=新建GoogleCredential.Builder()
.setClientSecrets(客户端ID、客户端机密)
.setJsonFactory(jsonFactory).setTransport(transport).build()
.setRefreshToken(“”).setAccessToken(“”);

编辑:更正了代码中的一个输入错误。

只是为了解释我的经历

有相同的问题(访问令牌为null),问题是我在没有发送setAccessType(“脱机”)的情况下接受了测试,并且允许从帐户访问

然后我将代码setAccessType(“脱机”)放在代码上,但仍然将令牌刷新为null


我的解决方案是撤销我要访问的帐户()的权限。在下一次测试中,我授予它。

试试这段代码。这是来自Alain+的混合溶液。这对我有用

GoogleCredential credential = createCredentialWithRefreshToken(
        HTTP_TRANSPORT, JSON_FACTORY, new TokenResponse().setRefreshToken(refreshToken));

credential.refreshToken(); 

String newAccessToken = credential.getAccessToken();

public static GoogleCredential createCredentialWithRefreshToken(HttpTransport transport, 
        JsonFactory jsonFactory, TokenResponse tokenResponse) {
    return new GoogleCredential.Builder().setTransport(transport)
        .setJsonFactory(jsonFactory)
        .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .build()
        .setFromTokenResponse(tokenResponse);
}
请遵循以下示例:

private static void getAccessTokenFromRefreshToken() throws IOException {
    GoogleCredential credentials = new GoogleCredential.Builder()
        .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .setJsonFactory(JSON_FACTORY).setTransport(httpTransport).build()
        .setRefreshToken(REFRESH_TOKEN);

    String accessToken = credentials.getAccessToken();
    System.out.println("Access token before: " + accessToken);

    credentials.refreshToken();

    accessToken = credentials.getAccessToken();
    System.out.println("Access token after: " + accessToken);
}
输出:

Access token before: null
Access token after: ya29.u4HC22-Avc0aaDC0g0zj1jhz2yjsJrm8qm0hU2eVeBrf6DKj3CcHDQ42KARH4y_d364-b

谢谢Alian,这真的很有帮助:)这让我得到了一个无效的答复。。。有什么想法吗?谢谢。如果您无法刷新令牌,这通常意味着用户已撤销访问权限,后续刷新将失败。在本例中,刷新令牌和访问令牌来自保存在数据库中的凭据?对于记录,您不必设置访问令牌。您只需设置刷新令牌,然后调用credentials.refreshToken(),这将为您获得一个新的访问令牌。由于我错误地调用了访问令牌而不是刷新令牌,所以编辑了我以前的代码。我没有得到任何东西,例如CLIENT\u SECRET。在哪里可以找到它?我只有客户ID