Android 帐户管理器不缓存 authToken

标签 android auth-token

您好,我在调用时遇到了恢复 authToken 的问题

mAccountManager.blockingGetAuthToken(Auth.getAccount(), Auth.AUTH_TOKEN_TYPE, true)

我得到一个空字符串,这让我查看了我的 AbstractAccountAuthenticator 类,特别是 getAuth()。这是它的作用:

public Bundle getAuthToken(AccountAuthenticatorResponse response,
        Account account, String authTokenType, Bundle options)
        throws NetworkErrorException {

    final AccountManager am = AccountManager.get(mContext);

    String authToken = am.peekAuthToken(account, authTokenType);
    String uid = am.getUserData(account, AccountManager.KEY_CALLER_UID);


    // return bundle with authToken
    if (!TextUtils.isEmpty(authToken)) {
        final Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
        result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
        result.putString(AccountManager.KEY_CALLER_UID, uid);
        return result;
    }


    return null;
}

peekAuthToken 返回一个空值,但我从 getUserData 获得了正确的 uid,这让我相信我正在正确添加帐户。这就是我设置 authToken 的方式:

mAccountManager.addAccountExplicitly(account, accountPassword, extraData);
//The addAccount is working, and I can obtain the extraData in getAuth
mAccountManager.setAuthToken(account, Auth.AUTH_TOKEN_TYPE, authtoken);
//I assume this is where the authToken is to be cached…but I can't retrieve it…
//The token does exist at this point

有什么建议吗?

最佳答案

正如您在文档中看到的那样,peek方法仅从 authtoken 缓存中获取 authToken。如果这返回 null,则意味着您的 authtoken 已失效,否则方法 AccountManager#getAuthToken会返回给你缓存的。

这有点令人困惑,但我会尽力解释。

你应该知道 getAuthToken来自 AccountManager 与 getAuthToken-Method 不同在验证器中。 AccountManager 在两者之间做一些缓存。 这意味着如果您在 Manager 上调用 getAuthToken,只要它在缓存中,它就会返回您的 AuthToken,而无需调用 Authenticator 的 getAuthToken 方法。

根据我的理解,这意味着在 getAuthToken 方法中调用 peek 是完全没有意义的。

我现在如何处理:

在 getAuthToken 的实现中(在身份验证器中),我从服务器重新请求 authtoken 并使用新 token 更新帐户,这会将它们存储在缓存中。无需查看该部分。

关于Android 帐户管理器不缓存 authToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25559218/

相关文章:

android - 未登录时是否可以获取公共(public) facebook 墙提要?

api - 如何安全地让我的用户使用刷新 token 登录?

android - VideoView Looping 在第一次循环后显示黑屏

android - 相机显示拉伸(stretch)图像

android - 使主页按钮调用 onFinish()

android - 如何从 Android 上保存的帐户中检索 Facebook-AuthToken

windows - 如何获取 Windows SYSTEM 用户 token

android - 如何在android中通过两个位图制作gif图像

java - 将获取的用户名放在抽屉导航 Activity 的导航 header 中