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