Мой идентификационный токен действителен в течение часа. Когда я вызываю getSessionInBackground для объекта CognitoUser в моем сервисном вызове через час, мой вызов терпит неудачу. Разве это не должно возвращать новый токен идентификатора, если срок действия предыдущего истек? Не помогает то, что такое поведение не всегда воспроизводится - это происходит только на некоторых экранах. Кроме того, похоже, что это происходит только в Android, а не в iOS.
AWS Cognito - getSessionInBackground не работает, когда идентификатор токена требует обновления
Ответы (1)
Это происходит потому, что sdk не является полностью потокобезопасным, эта ошибка возникает в aws-sdk-version ‹2.3, потому что один поток считывает правильное значение, и если срок действия токена истек, он очищает cachedToken, который не оставляет ничего для второго потока. read, а второй поток предполагает, что токенов не существует (пока первый поток обновляет токен), и, следовательно, выдает исключение, не авторизованное пользователем.
Если вы используете 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 для получения нового токена идентификатора. (Это крайний случай, но все же) https://github.com/aws/aws-sdk-android/pull/272