5

ここ数日間は、長時間実行されるリアルタイムアプリで問題が増えています。私は下のステップを歩みました。下部のコードスニペットには、アプリからの追加のデバッグ情報が含まれています。GoogleドライブリアルタイムAPI OAuth2リフレッシュエラー

ページが最初に開くと、OAuthトークンが正常に要求され、リアルタイムのドキュメント[A]が読み込まれます。 50分後(トークンが期限切れになる10分前)、新しいOAuthトークンを正常に再要求します[B]。最初のトークンが期限切れになった後、現在オープンしている接続には401の不正なエラーが発生し、新しいoauthトークン[C]が必要です。これは、[B]からの新しい有効なトークンを使用するように自身を更新する必要があったため、問題のように思えます。

しかし、アプリはこのようなエラーに耐えられるはずです。つまり、doc [D]を閉じてもう一度開いて別の新しいOAuthトークンを取得することで処理されます。残念ながら、この時点では、realtime APIはaccess_token [E]のエラーを無限ループに入れています。

すべてのOAuthトークンは、同じスコープでgapi.auth.authorizeを使用して要求され、setTokenは呼び出されません。以前はsetTokenを使ってみましたが、これはまったく同じ問題を抱えていました。

実際の質問 リアルタイムAPIのOAuthトークンをリフレッシュする正しい方法は何ですか?ドキュメントを閉じて開いたときにドライブAPIの内部で繰り返し失敗することを防ぐにはどうすればよいですか?

[A] 
_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXz9AYBkyympssqI" 
client_id: "XXXXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373610287" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373606687" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[B] 
_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXV2kzG4EMUppi" 
client_id: "XXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373613288" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373609688" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[C] 
GET https://drive.google.com/otservice/bind?id=1B-XXXXXXXXXXXXXXXXXXXXX_nRizfqmT…&RID=rpc&SID=XXXXXXXXXXXXXXXXX&CI=0&AID=221&TYPE=xmlhttp&zx=ns6e5dr7rf4&t=1 401 (Unauthorized) 

Drive Realtime API Error: token_refresh_required: The OAuth token must be refreshed. 

[D] 
[Close Realtime Document] 
[Open Realtime Document] 

_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMHzJXm2dF-" 
client_id: "XXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373613918" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373610318" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[E] 
[x100] Uncaught TypeError: Cannot read property 'o' of null 

ありがとうございます!

答えて

9

私はあなたの問題を見て、あなたは2つの主な問題について正しいと思います。

  1. リフレッシュされたトークンは、APIによって自動的に選択されません。
  2. 文書を閉じて再オープンすると、定期的に "nullのプロパティ 'oを読み取れません"というエラーが発生します。問題1について

クライアント接続のサーバは(例えば、401エラーが発生した後)不健康である一方で、我々はリフレッシュトークンに変更が保存されている任意の時間とも毎秒を拾います。これが明らかにカバーしていないのは、トークンを早期にリフレッシュし、文書に変更がない場合です。この場合、すでにトークンを更新していても401が表示されます。私は、この問題の修正に取り組んでいます。この問題は、接続が正常である間に30秒ごとに更新されたトークンを取得します。最終的には、トークンをすぐに取得できるようにイベント駆動型にしたいと思っていますが、gapi.authを変更する必要があるため、やや複雑です。

私のテストに基づいて、定期的なエラーは間違っているようです(内部的には、文書が閉じていても内部的に古い文書のトークンを更新しようとしていますが、プロパティ 'のエラーを読み取ることができません)。私もこの問題を解決するために取り組んでいますが、ドキュメントをリロードすることは可能です(ただし、古いドキュメントには多くのゴミエラーが表示されます)。これが事実でない場合は、私に教えてください。本当に文書を再読み込みすることはできません。

トークンのリフレッシュエラーが発生したときにドキュメントをリロードする必要はありません。これは、エラーハンドラに渡されたgapi.drive.realtime.ErrorオブジェクトのisFatalプロパティがfalseであり、エラーが回復可能であることを示しています。 token_refresh_requiredエラーに対する推奨される応答は、トークンを更新することです。ネットワークサービスは自動的に追いつくべきです。それでも問題が解決しない場合は、バグのように私に知らせてください。

- ブライアン(リアルタイムAPIデベロッパー)のみのトークンを更新するtoken_refresh_requiredのエラーの処理

+0

を繰り返し、エラーの問題を修正するのに十分でした。早速のご返事ありがとうございます! –

関連する問題