使用Google API Java客户端库刷新令牌

时间:2013-02-19 01:52:16

标签: android google-api-java-client

我正在使用Google API Java客户端http://code.google.com/p/google-api-java-client/,并且能够成功获取Android的访问令牌。

    // Google Accounts
credential = GoogleAccountCredential.usingOAuth2(this, CalendarScopes.CALENDAR);
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

由于我喜欢我的网络服务器进行脱机API调用,因此我需要一个刷新令牌。我一直在广泛搜索,还没有想出如何这样做。

理想情况下,我更喜欢通过WebView使用Google API Java客户端来获取刷新令牌(无需输入用户名或密码)。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

启动授权流程时需要设置以下内容:

  • approval prompt = force
  • access type = false

设置了这些参数后,google将返回刷新令牌,库将处理刷新。这对我有用:

new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, getClientCredential(),
                Arrays.asList(SCOPES)).setCredentialStore(new OAuth2CredentialStore()).setAccessType("offline")
                .setApprovalPrompt("force").build();

答案 1 :(得分:0)

您还可以通过创建配置为OAuth 2.0客户端ID的刷新令牌来做到这一点。

转到https://console.developers.google.com/apis/credentials

  1. 点击“创建凭据”。
  2. 点击“ OAuth客户端ID”。
  3. 选择“ Web应用程序”>命名。
  4. https://developers.google.com/oauthplayground添加到“授权的重定向URI”中。
  5. 点击创建。

下一步将需要ClientId和Secret。

然后转到https://developers.google.com/oauthplayground/

  1. 单击右上角的“ AOuth 2.0配置”。
  2. 选中“使用您自己的OAuth凭据”。
  3. 使用上面创建的OAuth 2.0凭据的客户端ID和密码更新“ OAuth客户端ID”和“ OAuth客户端密码”。
  4. 在左上角的第1步中,选择所有必要的范围。(请注意,请求中不匹配的范围将返回'invalid_scopes'。)
  5. 点击“授权API”。这会将您重定向到同意页面以允许权限。
  6. 在步骤2中,点击“交换令牌的授权代码”
  7. 您将获得带有刷新令牌的访问令牌。下一步,我们将需要此刷新令牌。

您可以使用此访问令牌对在范围中指定的服务进行身份验证。 除非访问令牌不与OAuth 2.0客户端绑定,否则访问令牌的寿命很短,并且刷新令牌会在24小时后过期(我们只是将刷新令牌的作用持续到用户撤销或由于6个月的不活动时间而终止)。

您需要在访问令牌过期之前刷新它。查看以下示例以了解操作方法。

public String getNewToken(String refreshToken, String clientId, String clientSecret) throws IOException {
        ArrayList<String> scopes = new ArrayList<>();

        scopes.add(CalendarScopes.CALENDAR);

        TokenResponse tokenResponse = new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(),
                refreshToken, clientId, clientSecret).setScopes(scopes).setGrantType("refresh_token").execute();

        return tokenResponse.getAccessToken();
}
上例中的

clientId和clientSecret是指OAuth 2.0客户端凭据。

您可以像这样创建一个“ GoogleCredential”

public Credential getCredentials() throws GeneralSecurityException, IOException, FileNotFoundException {
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    // Load client secrets.
    String CREDENTIALS_FILE_PATH = "/credentials.json"; //OAuth 2.0 clinet credentials json
    InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
    if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
    }
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    String clientId = clientSecrets.getDetails().getClientId();
    String clientSecret = clientSecrets.getDetails().getClientSecret();

    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setClientSecrets(clientId, clientSecret)
            .build();

    String refreshToken = "<REFRESH-TOKEN>"; //Find a secure way to store and load refresh token
    credential.setAccessToken(getNewToken(refreshToken, clientId, clientSecret));
    credential.setRefreshToken(refreshToken);

    return credential;
}

希望这对所有在Google Java API文档中受苦的人有所帮助。 :D