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コンソールの設定も確認する必要がありますか?
注意が必要なことの1つは、ユーザーが要求されたスコープに明示的に同意した場合にのみ、(アクセストークンに加えて)更新トークンが返されることです。基本的に、承認ページが表示されたとき。以降のすべてのフローは、アクセストークンのみを返します。
ここで、アプリケーションをテストし、最初に更新トークンを受け取ることを確認するために、approval_Prompt = forceパラメーター(builder.setApprovalPrompt("force")
)を使用して、承認ページがフローに表示されていることを確認します。ユーザーから明示的な同意を取得します。問題を整理し、更新トークンが適切に保存されていることを確認したら、そのフラグを削除できます(デフォルトはauto
)
詳細については、開発者ガイドの オフラインアクセスセクション も参照してください。
更新トークンを取得するには、accessType = "offline"とapprovalPrompt = "force"の両方を設定する必要があります。
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,
JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, SCOPE).setAccessType("offline").setApprovalPrompt("force").build();
私はこれを調べて、access_tokenは一度だけ使用する必要があると結論付けました。つまり、すべてのGoogleクエリは2段階のプロセスです。
サーバークロックが同期されていることを確認することについて、ここでいくつかの投稿を見ました。しかし、それは不必要な複雑さのようです。
より詳細な説明については: http://www.tqis.com/eloquency/googlecalendar.htm