5

在過去幾天裏,我看到一些長期運行的實時應用程序出現了一些問題日益嚴重的問題。我已經完成了下面的步驟,底部的代碼片段包含了來自應用的其他調試信息。Google Drive實時API OAuth2刷新錯誤

頁面首次打開時,它成功地請求OAuth令牌並加載實時文檔[A]。 50分鐘後(令牌到期前10分鐘),它會成功重新申請一個新的OAuth令牌[B]。第一個令牌過期後,當前打開的連接會獲得401未經授權的錯誤,並需要新的oauth令牌[C]。這本身就像是一個問題,因爲它應該更新自己以使用[B]中的新有效標記。

然而,應用程序仍然應該對這樣的錯誤具有適應性 - 因此可以通過關閉並重新打開文檔[D]並獲取另一個新的OAuth令牌來處理。不幸的是,在這一點上,實時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

我看了一下你的問題,我認爲你對這兩個主要問題是正確的。

  1. 刷新的令牌不會被API自動拾取。
  2. 關閉並重新打開文檔會導致定期「無法讀取null屬性」錯誤。

關於問題1,我們每次保存更改時都會選取一個刷新標記,並且每當服務器到客戶端連接不健康時(例如401錯誤後),都會刷新標記。這顯然不包含的情況是,您提前刷新標記並且文檔沒有任何更改。在這種情況下,即使您已經更新了令牌,也會看到401。我正在爲此問題修復此問題,該連接狀況良好時,將每30秒選取一次刷新的令牌。最終,我們希望將其作爲事件驅動,以便立即獲取令牌,但涉及更多,因爲它需要更改gapi.auth。

關於問題2,根據我的測試發現,週期性錯誤是虛假的(內部我們仍然試圖刷新舊文檔的標記,即使文檔已關閉,這就是爲什麼您會得到'無法讀取屬性的錯誤)。我正在爲此修復一個問題,但您仍應該能夠重新加載文檔(儘管您會看到很多舊文檔的垃圾錯誤)。請讓我知道如果不是這種情況,你真的無法重新加載文件。

我應該注意,當您收到令牌刷新錯誤時,您不需要重新加載文檔。這通過傳遞給您的錯誤處理程序的gapi.drive.realtime.Error對象的isFatal屬性爲false來指示,這表示錯誤是可恢復的。針對token_refresh_required錯誤的建議響應是刷新令牌 - 網絡服務應自動跟上。如果這不起作用,請隨時告訴我,因爲它是一個錯誤。

- Brian(實時API開發人員)

+0

處理token_refresh_required錯誤以僅更新標記足以解決重複的錯誤問題。感謝您及時的回覆! –