2

OAuth2Credential オブジェクトが access_token を更新しようとすると、invalid_grant のエラーが発生し、更新できなくなることがあります。私が使用したコードは、Google の python API と Mirror API の例に基づいています。

バックグラウンド:

  • oauth2client認証用のモジュールと OAuth2Credential オブジェクトを使用します。
  • OAuth2Credential オブジェクトを pickle 化して base64 化して、Google 独自のサンプル コードのようにデータベースに格納する
  • モジュールを使用apiclientしてミラー API を呼び出す
  • このコードは 3 つの異なるサーバーで実行され、送信しようとするとすべて同じ問題が発生します。
  • 私が求めるスコープは"https://www.googleapis.com/auth/glass.timeline""https://www.googleapis.com/auth/userinfo.profile"
  • access_type が「offline」に設定されていることを確認できます
  • 念のため、approval_prompt は「強制」でお願いします

ミラー API を呼び出すために使用されているコードは次のとおりです。

from apiclient.discovery import build
http = credential.authorize(http=httplib2.Http())
service = build("mirror", "v1", http=http)
payload = <JSON_PAYLOAD_HERE>
service.timeline().insert(body=payload).execute()

サービスが呼び出されると、access_token を更新する必要があることを意味する 401 が発行される可能性があります。次に、エラーinvalid_grantを伴う AccessTokenRefreshError を除く refresh メソッドを呼び出します。この時点では、access_token の有効期限が切れており、refresh_token で同じエラーが発生するだけなので、資格情報は問題ありません。

これは NTP の問題が原因で発生する可能性があると書かれているページを見たことがありますが、サーバーが同期していることを確認しました (さらに NTP サーバーを切り替えました)。文書化された他の可能性は、リサイクルされる前に 25 個のリフレッシュ トークンしか存在できないというものですが、Credential オブジェクトに store() メソッドを実装したので、リフレッシュすると新しい資格情報が所定の位置に保存されます (これが機能することを確認できます)。データベースを更新すると、データベースに新しい情報が表示されるため)。

この問題をオンデマンドで表示し始めるためのユーザーの資格情報を取得できないため、「しばらく待つ」以外に問題を再現するための条件を説明することはできません。この問題は、1 回の通話を認証して送信した直後から、100 回の通話を行ってから 1 週間後に発生することを確認しています。

今のところ問題を解決する唯一の方法は、ユーザーに再認証を依頼することですが、ユーザーの操作なしで API のオフラインを使用することを期待しているため、それは解決策ではありません。また、再認証が必要であることをユーザーに通知する方法もありません。

4

1 に答える 1

1

コメント スレッドからの回答: ユーザーが MyGlass Web サイトから Glassware をオフに切り替えたため、トークンが取り消されました。

ユーザーは、Glassware 認証エンドポイントにアクセスするか、利用可能な場合は MyGlass で「オン」に切り替えて、Glassware を使用できるようにするために、認証フローを再度実行する必要があります。

于 2013-06-10T16:21:46.913 に答える