2014-08-28 38 views
6

嗨,我有问题恢复我的authToken当我打电话Android的客户经理没有缓存的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 

有什么建议吗?

+0

您确定传递的账户变量与调用setAuthToken时的账户变量相同吗? – CChi 2014-08-28 22:57:19

+0

我相信是这样的,Auth.getAccount()返回AccountManager.get(App.getContext())。getAccountsByType(ACCOUNT_TYPE)[0];它正确地保存有关帐户的信息 – AIntel 2014-08-28 23:06:18

+0

我无法真正弄清楚看看这段代码片段会发生什么。但你可以查看这个链接accountmanager的完整覆盖。 http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/ – CChi 2014-08-28 23:54:20

回答

3

正如你可以在文档中看到的,peek方法只从authtoken-cache获得authToken。如果返回null,则表示您的authtoken已失效,否则方法AccountManager#getAuthToken将返回缓存的那个。

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

您应该知道AccountManager中的getAuthToken与认证程序中的getAuthToken-Method不相同。 AccountManager正在进行一些缓存。 表示如果您在Manager上调用getAuthToken,则只要它在缓存中,就会返回AuthToken,而不会调用Authenticator的getAuthToken方法。

对于我的理解,这意味着在getAuthToken方法内部调用peek完全没有意义。

我如何处理这个现在:

在getAuthToken的实现(认证),我再次请求从服务器的authToken,并与新的令牌更新帐户,将它们存储在缓存。没有必要偷看那部分。

+0

为了简化我的生活,我写了一个图书馆。如果你使用的是rxjava和翻新(<2.0.0),你可以考虑使用它。 https://github.com/andretietz/retroauth – andre 2016-03-21 14:51:55

+0

更新了此库,使用retrofit2而不使用rxjava作为依赖项 – andre 2016-09-27 13:59:52

1

请务必添加

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

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

0

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

你可以在AbstractAccountAuthenticatordocs了解更多。