2015-07-23 3 views
5

अपने Android एप्लिकेशन के लिए मेरे REST API का उपयोग करने के लिए एक OAuth2 टोकन सिस्टम पर काम कर रहा हूँ। मुझे क्लाइंट साइड पर टोकन रिफ्रेशमेंट पार्ट के साथ कुछ समस्याएं आ रही हैं।Android के लिए जेडब्ल्यूटी के साथ एक ताज़ा टोकन प्रक्रिया को लागू करने के लिए कैसे एप्लिकेशन

यहां प्रवाह है: मेरा ऐप सर्वर पर अनुरोध करता है (पैरामीटर में टोकन तक पहुंच के साथ) कुछ asynctask (PostCommentAsyncTask(), AddFriendAsyncTask() आदि ...), इसलिए यदि एक्सेस टोकन मान्य है तो यह ठीक है, लेकिन अगर यह नई accessToken पाने के लिए मिसाल AsyncTask की onPostExecute() विधि से मैं एक AsyncTask (GetRefreshTokenAsyncTask()) कॉल समाप्त हो गया है। मेरे लिए यह मुश्किल हिस्सा है। जब मुझे नई पहुंच टोकन मिलती है तो मैं सर्वर पर प्रारंभिक AsyncTask अनुरोध को फिर से निष्पादित करना चाहता हूं। मैं यह नहीं समझ सकता कि इसे ठीक से कैसे किया जाए।

example1:

अनुरोध PostCommentAsyncTask() -> (acessToken समाप्त हो गई है) ->GetRefreshTokenAsyncTask() -> अनुरोध PostCommentAsyncTask() -> (अच्छा टोकन) -> ठीक

संपादित करें:

मैंने अंततः Volley लाइब्रेरी का उपयोग करना चुना (अब Asynctask का उपयोग करने की आवश्यकता नहीं है)। जैसा कि मैं JSON Web Token का उपयोग करता हूं, मैं टोकन के पेलोड में एन्कोड किए जाने की समाप्ति तिथि की जांच कर सकता हूं।

public Boolean isAccessTokenExpired(String accessToken){ 

     String[] accessTokenPart = accessToken.split("\\."); 
     String header =accessTokenPart[0]; 
     String payload =accessTokenPart[1]; 
     String signature =accessTokenPart[2]; 

     try { 

      byte[] decodedPayload = Base64.decode(payload, Base64.DEFAULT); 
      payload = new String(decodedPayload,"UTF-8"); 
     } catch(UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 


     try { 
      JSONObject obj = new JSONObject(payload); 
      int expireDate = obj.getInt("exp"); 
      Timestamp timestampExpireDate= new Timestamp(expireDate); 
      long time = System.currentTimeMillis(); 
      Timestamp timestamp = new Timestamp(time); 

      return timestamp.after(timestampExpireDate); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
      return true; 
     } 

    } 

और यहाँ पहुँच टोकन/ताज़ा टोकन की एक नई जोड़ी पाने के लिए refreshJsonWebToken() विधि है:

यहाँ अगर पहुंच टोकन सर्वर को एक अनुरोध करने से पहले समाप्त नहीं हुआ है की जाँच करने के isAccessTokenExpired() विधि है

public void refreshJsonWebToken(){ 


      SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, 0); 
      String refreshToken = settings.getString("refreshToken", null); 

      final HashMap<String, String> params = new HashMap<String, String>(); 
      params.put("grant_type","refresh_token"); 
      params.put("client_id","client"); 
      params.put("refresh_token",refreshToken); 

      JsonObjectRequest req = new JsonObjectRequest(URL_OAUTH2, new JSONObject(params), new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 

         try { 

          String newRefreshToken = response.getString("refresh_token"); 
          SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, 0); 
          SharedPreferences.Editor editor = settings.edit(); 
          editor.putString("accessToken", newAccessToken); 
          editor.putString("refreshToken", newRefreshToken); 
          editor.apply(); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
      }, new Response.ErrorListener() { 


       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("grid", "Error: " + error.getMessage()); 

        } 
       } 
      }); 

      AppController.getInstance().addToRequestQueue(req); 


    } 

और finnally getPost() तरीका है जहाँ मैं मिसाल तरीकों का उपयोग:

मेरी OAUTH2 सर्वर से
+0

आप में 'मिल()' अपने दूसरे 'AsyncTask' की विधि इस्तेमाल कर सकते हैं आपके पहले 'AsyncTask' की' doInBackground() 'विधि। 'AsyncTask' की 'get()' विधि एक अवरोध विधि है जो परिणाम देता है - यह मुख्य/UI थ्रेड पर इसका उपयोग करने के लिए पूरी तरह बेकार है, लेकिन यदि आप इसे पहले' AsyncTask' 'doInBackground() ' विधि (जो अपने स्वयं के धागे पर चलती है) तो आप दूसरी 'AsyncTask'' get() 'विधि रिटर्न के बाद मूल कार्य को आसानी से ले जा सकते हैं। एक विचार है। – Squonk

+0

@ Frédéric: OAuth2 पासवर्ड अनुदान के लिए सर्वर साइड पर आपने कौन सी लाइब्रेरी का उपयोग किया था? मैं बैकएंड के रूप में नोड का उपयोग कर रहा हूँ। – j10

उत्तर

0

मुझे लगता है कि क्योंकि Looper तुल्यकालिक संदेश कतार जो यहाँ सुविधाजनक है Handler इस मामले में बेहतर है। आप HandlerThread बनाते हैं और इसके साथ अपने Handler को संबद्ध करते हैं। फिर आप अपनी जरूरतों के आधार पर postRunnable पर कॉल कर सकते हैं, उदा। यदि 0 टोकऔर PostCommentRunnable जोड़ते हैं, तो आप PostCommentRunnable जोड़ते हैं, - उन्हें अनुक्रमिक रूप से निष्पादित किया जाएगा।

आप अभी भी AsyncTasks साथ जाने के लिए, आप जाँच कर सकते हैं टोकन PostCommentAsyncTask शुरू करने से पहले समाप्त हो गया है कि क्या चाहते हैं? मुझे लगता है कि एक बेहतर डिजाइन होगा। आप नहीं है, तो आप उन्हें एक दूसरे के बाद निष्पादित कर सकते हैं कर सकते हैं, क्योंकि वे डिफ़ॉल्ट रूप से एक ही पृष्ठभूमि धागे पर काम करते हैं, उदाहरण के लिए:

new PostCommentAsyncTask().execute(); 

class PostCommentAsyncTask extends AsyncTask { 
    //... 
    onPostExecute() { 
     if (tokenExpired) { 
      new GetRefreshTokenAsyncTask().execute(); 
      new PostCommentAsyncTask().execute(); // this guy will wait till refresh token is executed. 
     } 
    } 
} 
+1

धन्यवाद आपके उत्तर के लिए! मैं वास्तव में एक अनुरोध लॉन्च करने से पहले टोकन की जांच कर सकता हूं (धन्यवाद जेडब्ल्यूटी)।मैं एंड्रॉइड के लिए नया हूं और मुझे हैंडलर के बारे में बहुत कुछ पता नहीं है, मुझे वास्तव में पता नहीं है कि वॉली कैसे प्रक्रिया करता है लेकिन एक हैंडलर के रूप में एक कतार प्रणाली है। मैंने कुछ पदों के साथ अपनी पोस्ट को संपादित किया है उम्मीद है कि इसे बेहतर किया जा सकता है या किसी की मदद कर सकता है! –

+0

ठीक है, आपकी पोस्ट अपडेट करने के लिए धन्यवाद। तो, अब आपका सवाल क्या है? मुझे लगता है कि अब सब कुछ स्पष्ट होना चाहिए –

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