5

データベースに保存されている「リフレッシュトークン」をもとに、新しい「アクセストークン」を取得したい。

ここに私が書いたコードがあります:

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

次のメッセージが表示されます。

com.google.api.client.auth.oauth2.TokenResponseException: 400 悪い

リクエスト { "エラー" : "invalid_grant" }

PHPスクリプトで同じCLIENT_ID、CLIENT_SECRET、および「リフレッシュトークン」を使用し、「アクセストークン」の有効期限が切れたときに「リフレッシュトークン」を使用して新しい「アクセストークン」を取得できました。

javadoc.google-oauth-java-client に基づいてコードを書きました。

コードを変更して新しいアクセストークンを取得する方法を知っている人はいますか?

前もって感謝します。

更新: 問題は、データベースに json_decode を実行せずに refresh_token を保存していて、JSON でエスケープ文字と見なされる "\" が含まれていたことです。

4

2 に答える 2

2

古いドキュメントを見つけたようです。リンクする JavaDoc は、クライアント ライブラリのバージョン 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();
于 2012-11-26T20:13:04.720 に答える
1

http ステータス 400 とメッセージ "invalid_grant" を取得した場合。HTTP_TRANSPORT、JSON_FACTORY、CLIENT_ID、CLIENT_SECRETのインスタンスを確認する必要があると思います。

于 2013-09-10T02:04:19.343 に答える