在过去的几天里,我一直看到一些长期运行的实时应用程序出现了一些日益严重的问题。我已经完成了以下步骤,底部的代码片段包含应用程序的其他调试信息。
首次打开页面时,它成功请求OAuth令牌并加载实时文档[A]。 50分钟后(令牌到期前10分钟),它会成功重新请求新的OAuth令牌[B]。第一个令牌到期后,当前打开的连接会收到401未经授权的错误,并需要一个新的oauth令牌[C]。这本身就像一个问题,因为它应该更新自己以使用[B]中的新有效令牌。
然而,应用仍然可以适应这种情况发生的错误 - 因此可以通过关闭并重新打开doc [D]并获取另一个新的OAuth令牌来处理它。不幸的是,此时,实时API处于无限循环中,导致access_token [E]出错。
使用具有相同范围的gapi.auth.authorize请求所有OAuth令牌,并且不调用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
谢谢!
答案 0 :(得分:9)
我看了一下你的问题,我认为你对这两个主要问题是正确的。
关于问题1,我们会在保存更改时随时获取刷新的令牌,并且在服务器到客户端连接时每隔一秒(例如,在401错误之后)获取刷新的令牌。这显然没有涵盖的情况是您提前刷新令牌并且文档没有任何更改。在这种情况下,即使您已经更新了令牌,也会看到401。我正在为这个问题做一个修复,它会在连接健康时每隔30秒获取一次刷新的令牌。最终我们希望将此事件驱动,以便立即获取令牌,但这需要更多参与,因为它需要更改gapi.auth。
关于问题2,基于我的测试,似乎周期性错误是假的(内部我们仍然试图刷新旧文档的令牌,即使文档已经关闭,这就是为什么你得到'不能读取属性'错误)。我正在为此修复此问题,但您仍然可以重新加载文档(尽管您将看到旧文档的大量垃圾错误)。如果情况不是这样,请告诉我,你真的无法重新加载文件。
我应该注意,当您收到令牌刷新错误时,您不需要重新加载文档。事实上,传递给错误处理程序的gapi.drive.realtime.Error对象的isFatal属性为false,表明错误是可恢复的。对token_refresh_required错误的建议响应是刷新令牌 - 网络服务应自动赶上。如果这不起作用,请随时告诉我,因为它是一个错误。
- Brian(实时API开发人员)