6

嗨,当我打电话时,我在恢复我的 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 返回一个空值,但是我uid从 getUserData 得到了正确的结果,这让我相信我正确地添加了帐户。这就是我设置 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

有什么建议么?

4

3 回答 3

4

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

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

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

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

我现在如何处理:

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

于 2015-06-17T09:26:36.550 回答
2

确保添加

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

从代码中设置 authToken 后。

于 2015-09-14T06:45:31.830 回答
0

如果您使用android:customTokens=true.

您可以在AbstractAccountAuthenticator 文档中阅读更多内容。

于 2017-03-30T14:10:14.827 回答