Android Account Manager 未缓存 authToken

Posted

技术标签:

【中文标题】Android Account Manager 未缓存 authToken【英文标题】:Android Account Manager not caching the authToken 【发布时间】:2014-10-22 22:20:20 【问题描述】:

您好,我在拨打电话时无法恢复我的 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

有什么建议吗?

【问题讨论】:

你确定传入的account变量和你调用setAuthToken时的那个一样吗? 我相信,Auth.getAccount() 返回 AccountManager.get(App.getContext()).getAccountsByType(ACCOUNT_TYPE)[0];它正确地保存了有关帐户的信息 我无法通过查看此代码片段来弄清楚发生了什么。但是您可以查看此链接以了解 accountmanager 的完整报道。 udinic.wordpress.com/2013/04/24/… 【参考方案1】:

正如您在文档中看到的,peek 方法仅从 authtoken-cache 获取 authToken。如果返回 null,则表示您的 authtoken 已失效,否则 AccountManager#getAuthToken 方法会返回缓存的。

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

您应该知道,来自 AccountManager 的 getAuthToken 与身份验证器中的 getAuthToken-Method 不同。 AccountManager 在两者之间进行了一些缓存。 意思是如果你在Manager上调用getAuthToken,只要它在缓存中,它就会返回你的AuthToken,而不调用Authenticator的getAuthToken方法。

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

我现在如何处理:

在 getAuthToken(在验证器中)的实现中,我从服务器重新请求 authtoken 并使用新令牌更新帐户,这会将它们存储在缓存中。没必要偷看那部分。

【讨论】:

为了简化我的生活,我写了一个库。如果您使用 rxjava AND retrofit (github.com/andretietz/retroauth 使用没有 rxjava 作为依赖的 retrofit2 更新了这个库【参考方案2】:

确保添加

setAccountAuthenticatorResult(authIntent.getExtras());
setResult(RESULT_OK,authIntent);

一旦你从你的代码中设置了 authToken。

【讨论】:

【参考方案3】:

如果您使用android:customTokens=true 声明您的身份验证器,就会发生这种情况。

您可以在AbstractAccountAuthenticatordocs阅读更多内容。

【讨论】:

以上是关于Android Account Manager 未缓存 authToken的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Android Account Manager 获取 App Engine 的 OAuth 访问令牌吗?

求助,Android SDK manager不显示那些未安装的包了

M1 mac 上的 android studio 和 manager 错误(未安装模拟器)

ldap+ldap-account-manager+svn+apache+php做账号管理

过滤对象的 NSArray 以具有唯一的属性对象

我的手机里面有这个,我的是安卓4.0.4系统,Google Account Manager可以删除么??这个是干嘛的?