使用Java从刷新令牌中获取访问令牌

时间:2012-05-10 11:39:11

标签: google-drive-api

我使用此处给出的示例程序https://developers.google.com/drive/credentials#retrieve_oauth_20_credentials

从授权代码中获取了刷新令牌和访问令牌

但是没有示例程序从刷新令牌获取访问令牌,即,当我们没有授权代码时。有什么指针吗?有没有办法只使用刷新令牌和访问令牌来实例化驱动器服务对象?

4 个答案:

答案 0 :(得分:22)

DrEdit Java示例提供了有关如何从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>");

编辑:更正了代码中的拼写错误。

答案 1 :(得分:3)

试试这段代码。这是Alain + https://cloud.google.com/bigquery/authorization的混合解决方案。这对我有用。

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

答案 2 :(得分:1)

只是为了解释一下我的经历。

有同样的问题(访问令牌为null)问题是我在没有发送setAccessType(“离线”)的情况下进行了测试,并且从帐户访问权限被允许访问。

然后我将代码设置为setAccessType(“离线”)代码,但仍将令牌刷新为null。

我的解决方案是撤销我要访问的帐户(https://accounts.google.com/b/0/IssuedAuthSubTokens?hl=en)的权限。在接下来的测试中,我授予它。

答案 3 :(得分:0)

请遵循以下示例:

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