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 のオフラインを使用することを期待しているため、それは解決策ではありません。また、再認証が必要であることをユーザーに通知する方法もありません。