14

我使用此处给出的示例程序从授权代码中获取了刷新令牌和访问令牌https://developers.google.com/drive/credentials#retrieve_oauth_20_credentials

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

4

4 回答 4

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

编辑:更正了代码中的错字。

于 2012-05-10T16:01:15.317 回答
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);
}
于 2014-11-23T12:48:35.807 回答
1

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

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

然后我把我的代码 setAccessType(“离线”)代码,但仍然刷新令牌为空。

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

于 2014-03-08T13:06:39.360 回答
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
于 2015-07-25T21:52:42.490 回答