2014-08-28 10 views
6

हाय ग्रहण कर रही मैं अपने authToken उबरने जब मैं फोनएंड्रॉयड खाता प्रबंधक 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 से जो मुझे नेतृत्व मैं खाता ठीक द्वारा जोड़ा जा रहा विश्वास करने के लिए हो रही है: यहाँ क्या अपने कर रहा है। इस प्रकार मैंने ऑथोकन सेट किया है:

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

+0

मैं इतना विश्वास है, Auth.getAccount() रिटर्न AccountManager.get (App.getContext()) getAccountsByType (ACCOUNT_TYPE) [0]। और यह – AIntel

+0

खाते के बारे में जानकारी सही ढंग से रखता है, मैं वास्तव में यह पता नहीं लगा सकता कि इस कोड खंड को देखकर क्या होता है। लेकिन आप खाता प्रबंधक के पूर्ण कवरेज के लिए यह लिंक देख सकते हैं। http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/ – CChi

उत्तर

3

आप दस्तावेज में पढ़ सकते हैं के रूप में, peek विधि केवल authToken authtoken-कैश से हो जाता है। यदि यह शून्य हो रहा है, तो इसका मतलब है कि आपके लेखक को अमान्य कर दिया गया है, अन्यथा विधि AccountManager#getAuthToken आपको कैश किए गए एक को वापस कर देगी।

इसमें कुछ समय भ्रामक है, लेकिन मैं समझाने की कोशिश करेंगे।

आपको पता होना चाहिए कि खाता प्रबंधक से getAuthToken प्रमाणीकरणकर्ता में getAuthToken-Method जैसा नहीं है। खाता प्रबंधक कुछ कैशिंग कर रहा है। मतलब है कि अगर आप प्रबंधक पर getAuthToken फोन, यह आपके AuthToken जब तक कि वह के रूप में कैश में से प्रमाणक के getAuthToken विधि बुला के बिना लौट जाएँगे।

मेरी समझ का मतलब है कि यह है कि यह getAuthToken विधि के अंदर झांकना कॉल करने के लिए पूरी तरह से व्यर्थ है के लिए

मैं इस अब कैसे संभाल:

(प्रमाणक में) getAuthToken के कार्यान्वयन में, मैं सर्वर से authtoken फिर से विनती करता हूँ और नए टोकन के माध्यम से खाता अपडेट है, जो उन्हें में संग्रहीत करेगा कैश। उस हिस्से पर peeking की कोई ज़रूरत नहीं है।

+0

मेरे जीवन को आसान बनाने के लिए मैं एक पुस्तकालय लिखा था। यदि आप rxjava और retrofit (<2.0.0) का उपयोग कर रहे हैं, तो आप इसका उपयोग करने पर विचार कर सकते हैं। https://github.com/andretietz/retroauth – andre

+0

इस पुस्तकालय निर्भरता के रूप में rxjava बिना retrofit2 का उपयोग कर अद्यतन – andre

1

आप जोड़ना

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

एक बार आप अपने कोड से authToken सेट सुनिश्चित करें।

0

अगर आप android:customTokens=true के साथ अपने प्रमाणक घोषित हो सकता है।

आप AbstractAccountAuthenticatordocs में और अधिक पढ़ सकते हैं।

संबंधित मुद्दे