2017-03-29 91 views
2

我的ID令牌有效一小時。當我在一小時後的服務呼叫中的CognitoUser對象上調用getSessionInBackground時,我的呼叫失敗。如果前一個已過期,是不是應該返回一個新的ID令牌?這並不意味着這種行爲不能一致地重現 - 它只發生在某些屏幕上。此外,它似乎只發生在Android,而不是iOS。AWS Cognito - 當ID令牌需要刷新時,getSessionInBackground失敗

回答

1

這種情況在sdk中並不完全是線程安全的,這個錯誤發生在aws-sdk-version < 2.3,cuz一個線程讀取正確的值,如果令牌過期,它清除cachedToken,第二個線程讀取,第二個線程假定沒有令牌存在(而第一個線程刷新令牌),並因此引發用戶未授權的異常。

如果您正在使用AWS-sdk2.2這是突出的錯誤,你可以使用下面的代碼片段來解決它:

new Thread(new Runnable() { 

     @Override 
     public void run() { 

      try { 
       semaphore.acquire(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      CognitoUser user = userPool.getCurrentUser(); 

      user.getSessionInBackground(new AuthenticationHandler() { 
       @Override 
       public void onSuccess(final CognitoUserSession userSession) { 
        Log.d("Authenticator.java", userSession.getIdToken().getJWTToken().toString()); 
        semaphore.release(); 
        callback.onSuccess(userSession); 
       } 

       @Override 
       public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String UserId) { 

        semaphore.release(); 
        callback.onNeedsPassword(); 
       } 

       @Override 
       public void getMFACode(MultiFactorAuthenticationContinuation continuation) { 

        semaphore.release(); 
        callback.onNeedsPassword(); 
       } 

       @Override 
       public void onFailure(final Exception exception) { 

        semaphore.release(); 
        callback.onFailure(exception); 
       } 
      }); 
     } 
    }).start(); 

還有當前的錯誤AWS-SDK-2.4版本,與此相關,這會增加您的網絡流量,如果您對aws進行多個呼叫以獲取新的ID令牌(其邊緣情況下,但仍然) https://github.com/aws/aws-sdk-android/pull/272

+0

這是有效的!謝謝! – blackout