web-dev-qa-db-ja.com

オフライントークンを取得してトークンを更新し、GoogleAPIへのアクセスを自動更新する方法

OAuth2とそのためのGoogleクライアントライブラリ(AppengineとGWT BTW上にあります)を使用してGoogle API(Calendar APIから開始)にアクセスするアプリを開発しています。

_OAuth2Call_バックサーブレットを実装し、Google AbstractAppEngineAuthorizationCodeCallbackServletを拡張しました。

私はそれを機能させており、アクセスしてカレンダーなどを見ることができますが、2つの問題があります。

1)オフラインアクセスを明示的に要求したにもかかわらず、更新トークンを取得しません。

_public static GoogleAuthorizationCodeFlow newFlow( String scope ) throws IOException {
    GoogleAuthorizationCodeFlow.Builder builder = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, 
            JSON_FACTORY,
            getClientSecrets(), 
            Collections.singleton( scope ) );

    builder.setCredentialStore( new AppEngineCredentialStore() ).setAccessType("offline");

    return builder.build();
}
_

2)自動更新機能の設定方法がわかりません。これらのページでは、方法について説明しています。

しかし、更新リスナーを追加する場所がわかりません。 _GoogleAuthorizationCodeFlow.Builder_クラスとは異なり、_Credential.Builder_クラスにはそのようなメソッドはありません。

編集コードをさらにデバッグした後、資格情報が(onSuccess()メソッドで)戻ってきたとき、すでにRefreshListenerが設定されているようです.....おそらくそれがデフォルトであり、私の唯一の問題は、それを求めているにもかかわらず、_refresh_token_を取得できないことです。

たぶん、Google APIコンソールの設定も確認する必要がありますか?

15

注意が必要なことの1つは、ユーザーが要求されたスコープに明示的に同意した場合にのみ、(アクセストークンに加えて)更新トークンが返されることです。基本的に、承認ページが表示されたとき。以降のすべてのフローは、アクセストークンのみを返します。

ここで、アプリケーションをテストし、最初に更新トークンを受け取ることを確認するために、approval_Prompt = forceパラメーター(builder.setApprovalPrompt("force"))を使用して、承認ページがフローに表示されていることを確認します。ユーザーから明示的な同意を取得します。問題を整理し、更新トークンが適切に保存されていることを確認したら、そのフラグを削除できます(デフォルトはauto

詳細については、開発者ガイドの オフラインアクセスセクション も参照してください。

21
vlatko

更新トークンを取得するには、accessType = "offline"とapprovalPrompt = "force"の両方を設定する必要があります。

   GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,
                JSON_FACTORY, CLIENT_ID, CLIENT_SECRET,  SCOPE).setAccessType("offline").setApprovalPrompt("force").build();
6
Alexandra

私はこれを調べて、access_tokenは一度だけ使用する必要があると結論付けました。つまり、すべてのGoogleクエリは2段階のプロセスです。

  1. Refresh_tokenを使用して、一時的なaccess_tokenを生成します
  2. 操作に必要な1つ以上のクエリにaccess_tokenを使用します。

サーバークロックが同期されていることを確認することについて、ここでいくつかの投稿を見ました。しかし、それは不必要な複雑さのようです。

より詳細な説明については: http://www.tqis.com/eloquency/googlecalendar.htm

0
Sunny Jim