2

Marketplace アプリの機能の 1 つは、IMAP 経由でユーザーの Gmail アカウントにアクセスすることを利用しています。次のように、google-api-java-client および google-oauth-java-client ライブラリと、java-gmail-imap プロジェクトのこの例に似たコードを使用しています。

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCOUNT_ID)
    .setServiceAccountScopes(Arrays.asList(GMAIL_SCOPE))
    .setServiceAccountPrivateKey(PRIVATE_KEY)
    .setServiceAccountUser(emailAddress)
    .build();
credential.refreshToken();

次に、 https://code.google.com/p/google-mail-oauth2-toolsの例に基づいたコードを使用して、IMAP 接続を確立します。

IMAPStore imapStore = OAuth2Authenticator.connectToImap("imap.googlemail.com",
    993, emailAddress, credential.getAccessToken(), false);

ほとんどの場合、これは正しく機能しているように見えますが、少数ではあるがかなりの数のリクエストで、Google への呼び出しがrefreshToken()HTTP 500 エラーで失敗し、通常は JSON が返される HTML レスポンスが返されることが確認されています。

<p class="large"><b>500.</b> <ins>That's an error.</ins></p>
<p class="large">The server could not process your request.
<ins>That's all we know.</ins></p>

Google のデベロッパー アドボケイトから、更新トークンはサービス アカウントではサポートされていないため、この例のようなアプローチを使用する必要があるとのアドバイスを受けました。

ただし、thenへの呼び出しがないと、資格情報オブジェクトにデータが取り込まれ、呼び出し時にrefreshTokenaccessTokenNullPointerExceptionOAuth2Authenticator.connectToImap

ソースからは、サービス アカウントを処理するためにオーバーライドされてGoogleCredentialいるように見えexecuteRefreshToken()ました。つまり、更新を実行する代わりに、単に新しいトークンを要求し、次にこのコードのビットでCredentialアクセス トークンの入力を処理します。

TokenResponse tokenResponse = executeRefreshToken();
if (tokenResponse != null) {
    setFromTokenResponse(tokenResponse); ....

refreshToken()断続的な 500 エラーを回避するために呼び出しを再試行ループに入れる必要があるかどうか、またはこのシナリオで推奨されるアプローチに従うためにコードに他の変更を加える必要があるかどうかはわかりませんでした。

誰でもアドバイスできますか?

4

1 に答える 1

1

私は本番環境でjava-gmail-imap のサンプルコードを使用しています (ただし、大学ポータルで受信トレイを表示するためにのみ使用されます。たとえば、同じ更新トークンを再利用する必要があるような操作はあまりありません)。

あなたの使い方にもよりますが、あなたの場合、ある種のスロットルが機能しているのではないかと思います ( Gmail が時々アクセスをスロットルできる場所を読んだことがあります)。

他の場所で、Google API が指数バックオフ アルゴリズムを使用して再試行することについて話しているのを見たことがあります。

OAuth 2.0 の使用法を他の Google サービス API や Gmail と比較するときは、少し注意が必要です。Gmail は、XOAUTH2 を使用するという点で特別です。そうは言っても、 refreshToken 呼び出しが必要と思われる他の Google API を見てきました。ドキュメントは少し不明確で、 「必要に応じてアクセス トークンを更新する」などと書かれています (この手順がないと機能しないようですが、資格情報を介して更新トークンを再利用する実験は行っていません。 setRefreshToken(String refreshToken))。

私はあなたがどのようにうまくやっていくのか興味があります。

于 2014-04-01T22:14:11.200 に答える