2014-08-28 35 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瞭解更多。