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