15

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クラスにはそのようなメソッドはありません

EDITコードをさらにデバッグした後、資格情報が(onSuccess()メソッドで)戻ってきたとき、RefreshListenerすでにセットがあるようです.....おそらくそれはデフォルトであり、私の唯一の問題はrefresh_token、尋ねたにもかかわらず、それのための。

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

4

3 に答える 3

22

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

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

詳細については、開発者ガイドのオフライン アクセス セクションにも記載されています。

于 2012-12-10T18:47:12.017 に答える
8

リフレッシュ トークンを取得するには、 = " offline " と= " force "の両方 を設定する必要があります。accessTypeapprovalPrompt

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT,
            JSON_FACTORY,
            CLIENT_ID,
            CLIENT_SECRET,  
            SCOPE)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
于 2013-09-10T14:27:52.177 に答える
0

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

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

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

詳細な説明: http://www.tqis.com/eloquency/googlecalendar.htm

于 2013-01-05T20:02:45.613 に答える