0

几天前,我问如何保留 Box 令牌(在 Box Android API 中加载、保存和使用身份验证数据)。现在,当用户想要访问他的 Box 帐户时,我使用此代码进行配置BoxAndroidClient

client = new BoxAndroidClient(C, S);
client.authenticate(loadAuth()); //loadAuth() returns BoxAndroidOAuthData object

在获得认证数据后的短时间内,它运行良好。但大约一个小时后,我得到一个AuthFatalFailureException

07-06 17:21:01.841: W/System.err(3647): com.box.boxjavalibv2.exceptions.AuthFatalFailureException
07-06 17:21:01.841: W/System.err(3647):     at com.box.boxjavalibv2.authorization.OAuthDataController.doRefresh(OAuthDataController.java:275)
07-06 17:21:01.841: W/System.err(3647):     at com.box.boxjavalibv2.authorization.OAuthDataController.refresh(OAuthDataController.java:191)
07-06 17:21:01.841: W/System.err(3647):     at org.redscorpio.cloudtest.network.Box$2$1.run(Box.java:71)

第 71 行是

client.getOAuthDataController().refresh();

但每次我需要访问 Box 时都会发生这种情况:

client.getFoldersManager().getFolderItems(current.getId(), LIST_REQUEST()).getEntries();
client.getFoldersManager().getFolder("0", DEFAULT_REQUEST);

我怀疑我的令牌在某个时候失效了,但我不知道为什么它不能更新,以及为什么它会在这么短的时间后发生。
我能做些什么来防止这种情况发生?

4

2 回答 2

1

我不确定发生了什么。sdk 会自动刷新令牌。但是每次刷新令牌时,您实际上都会获得一个新的刷新令牌和新的访问令牌,旧的刷新令牌将不再有效。所以基本上最简单的方法可能是每次您的 api 调用成功时更新您存储的 OAuth 令牌对象。

同时,您能否仔细检查(也许添加一些日志记录)存储的刷新令牌和访问令牌是否是最新的?您可以在令牌刷新的代码中注销访问令牌:com.box.boxjavalibv2.authorization.OAuthDataController 类,doRefresh() 方法。并在进行 api 调用的地方:com.box.boxjavalibv2.authorization.OAuthAuthorization 类,getAuthString() 方法。

于 2013-07-08T20:28:33.213 回答
1

当用户登录并接受您的应用程序的授权时,您将 authentication_code 交换为 access_token 和 refresh_token(响应如下所示)。您的令牌无效的原因是 access_token 在一小时后过期。您可以将有效期为 14 天的 refresh_token 换成另一个一小时的访问令牌。这就是为什么您希望应用程序同时存储 access_token 和 refresh_token 的原因,以确保用户在超过 14 天后返回应用程序时只需要重新进行身份验证。

将 refresh_token 用于另一个 access_token 将始终返回一个以上(刷新 + 访问)。

{“access_token”:“T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl”,“expires_in”:3600,“token_type”:“bearer”,“refresh_token”:“J7rxTiWOHMoSC1isKZKBZWizoRXjkQzig5C6jFgCVJ9bUnsUfGMinKBDLZWP9BgR}”

于 2013-07-06T19:21:25.033 回答