अपने 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()
तरीका है जहाँ मैं मिसाल तरीकों का उपयोग:
आप में 'मिल()' अपने दूसरे 'AsyncTask' की विधि इस्तेमाल कर सकते हैं आपके पहले 'AsyncTask' की' doInBackground() 'विधि। 'AsyncTask' की 'get()' विधि एक अवरोध विधि है जो परिणाम देता है - यह मुख्य/UI थ्रेड पर इसका उपयोग करने के लिए पूरी तरह बेकार है, लेकिन यदि आप इसे पहले' AsyncTask' 'doInBackground() ' विधि (जो अपने स्वयं के धागे पर चलती है) तो आप दूसरी 'AsyncTask'' get() 'विधि रिटर्न के बाद मूल कार्य को आसानी से ले जा सकते हैं। एक विचार है। – Squonk
@ Frédéric: OAuth2 पासवर्ड अनुदान के लिए सर्वर साइड पर आपने कौन सी लाइब्रेरी का उपयोग किया था? मैं बैकएंड के रूप में नोड का उपयोग कर रहा हूँ। – j10