AWS Cognito - getSessionInBackground не работает, когда идентификатор токена требует обновления

Мой идентификационный токен действителен в течение часа. Когда я вызываю getSessionInBackground для объекта CognitoUser в моем сервисном вызове через час, мой вызов терпит неудачу. Разве это не должно возвращать новый токен идентификатора, если срок действия предыдущего истек? Не помогает то, что такое поведение не всегда воспроизводится - это происходит только на некоторых экранах. Кроме того, похоже, что это происходит только в Android, а не в iOS.


person blackout    schedule 29.03.2017    source источник


Ответы (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

person Nikhil Shekhawat    schedule 29.03.2017