2015-07-23 13 views
5

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

akışıdır süresi doldu Yeni erişim almak için 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 etmek isAccessTokenExpired() 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:

benim OAuth2 sunucusundan
+0

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

+0

@ 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

cevap

0

Bu durumda Looper'un burada uygun olan senkronize ileti kuyruğu olduğundan Handler daha iyi olduğunu düşünüyorum. Bir HandlerThread oluşturun ve Handler ile ilişkilendirin. Ardından ihtiyaçlarınıza bağlı olarak postRunnable numaralı telefonu arayabilirsiniz. PostCommentRunnable eklersiniz, belirtecin süresi dolduysa GetRefreshTokenRunnable ve PostCommentRunnable ekleyin, - bunlar sırayla yürütülür.

AsyncTasks ile devam etmek istiyorsanız, PostCommentAsyncTask başlatılmadan önce belirtecin son kullanma tarihinin olup olmadığını kontrol edebilir misiniz? Bence bu daha iyi bir tasarım olacak.

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

Cevabınız için teşekkürler! Gerçekten bir istek başlatmadan önce belirteci kontrol edebilirim (teşekkürler JWT).Ben android için yeni ve Handler hakkında fazla bir şey bilmiyorum, gerçekten Volley nasıl işlediğini bilmiyorum ama bir Handler olarak bir kuyruk sistemi var. Gönderiyi geliştirebileceğime inandığım bazı iş umutları ile düzeltdim ya da kimseye yardım etsin! –

+0

Tamam, gönderinizi güncellediğiniz için teşekkürler. Peki, şimdi senin sorunun ne? Bence şimdi her şey açık olmalı –

İlgili konular