Android uygulamam için REST API'mma erişmek için bir Oauth2 Token sisteminde çalışıyorum. İstemci tarafında token ferahlık bölümü ile bazı sorunlar yaşıyorum. Benim app sunucusu sayesinde (parametrede bir erişim Token ile birlikte) bir istekte bazı asynctask (PostCommentAsyncTask()
, AddFriendAsyncTask()
vb ...), bu yüzden accessToken geçerli olup olmadığını o eğer tamam, ama: Burada Android uygulamaları için JWT ile bir yenileme belirteci süreci nasıl uygulanır
AsyncTask
numaralı telefonun
onPostExecute()
yönteminden başka bir
AsyncTask
(
GetRefreshTokenAsyncTask()
) arayın. İşte benim için zor kısmı. Yeni erişim Simgesini aldığımda, sunucuya ilk AsyncTask isteğini yeniden çalıştırmak istiyorum. Nasıl düzgün yapılacağını anlayamıyorum.
Örnek 1:
talep PostCommentAsyncTask()
-> (acessToken süresi) ->GetRefreshTokenAsyncTask()
-> talep PostCommentAsyncTask()
-> (iyi belirteci) -> Tamam
DÜZENLEME:
Sonunda Volley
kütüphanesini kullanmayı seçtim (artık Asynctask kullanmanıza gerek yok). JSON Web Token
kullanıyorken, belirtecin yükünde kodlanan son kullanma tarihini kontrol edebilirim. Erişim belirteci/Yenile belirteci yeni bir çift almak için refreshJsonWebToken()
yöntem burada
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;
}
}
Ve edilir: Burada
Erişim Jetonu sunucuya bir istek yapmadan önce süresi dolmamış olup olmadığını kontrol etmekisAccessTokenExpired()
yöntemdir
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);
}
Ve finnally getPost()
yöntemle ı emsal yöntemleri kullanın:
You ikinci 'AsyncTask' ait' almak() 'yöntemi kullanabilirsiniz: bunlar örneğin varsayılan olarak aynı arka plan iş parçacığı üzerinde çalışmak, çünkü o zaman bunları art arda yürütebileceği yapamıyorsanız İlk 'AsyncTask'ınızın doInBackground()' yöntemi. 'AsyncTask'' get() 'yöntemi bir sonuç döndüren bir engelleme yöntemidir - ana/UI iş parçacığı üzerinde kullanmak tamamen işe yaramaz, ancak ilk AsyncTask'ın doInBackground() işlevinden çağırırsanız Yöntem (kendi iş parçacığı üzerinde çalışır) sonra ikinci AsyncTask'ın get() yöntemi geri döndüğünde, özgün görevle devam edebilirsiniz. Sadece bir fikir. – Squonk
@ Frédéric: OAuth2 parola yardımı için Sunucu tarafında hangi kütüphaneyi kullandınız? Düğüm arka uç olarak kullanıyorum. – j10