AWS Cognito SignOut Android - PullRequest
       37

AWS Cognito SignOut Android

0 голосов
/ 02 ноября 2018

Я использую последнюю версию AWS SDK для Android.

implementation 'com.amazonaws:aws-android-sdk-core:2.7.6'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.7.6'
implementation 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.7.6'

Мой обработчик аутентификации по большей части взят из их примера кода.

    // create a handler for the sign-in process
    private AuthenticationHandler authenticationHandler = new AuthenticationHandler() {

        @Override
        public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
//            String idToken = userSession.getIdToken().getJWTToken();
//            Map<String, String> logins = new HashMap<>();
//            logins.put("cognito-idp.us-east-1.amazonaws.com/" + getString(R.string.user_pool_id), idToken);
//            AuthHelper.getInstance().getCredentialsProvider().setLogins(logins);
//
//            new RefreshCognitoCredentials().execute();

            startActivity(new Intent(LoginActivity.this, MainActivity.class));
            finish();
        }

        @Override
        public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
            String password = inputPassword.getText().toString();

            AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, password, null);
            authenticationContinuation.setAuthenticationDetails(authenticationDetails);
            authenticationContinuation.continueTask();
        }

        @Override
        public void getMFACode(MultiFactorAuthenticationContinuation continuation) {

        }

        @Override
        public void authenticationChallenge(ChallengeContinuation continuation) {

        }

        @Override
        public void onFailure(Exception exception) {
            String error = AuthHelper.formatException(exception);
            layoutUsername.setErrorEnabled(true);
            layoutUsername.setError(error);
        }
    };

Аутентификация работает просто отлично. И кешируется как надо. В своей активности на заставке я могу проверить CognitoUser.getCurrentUser (). GetUserId ().

А теперь, чтобы выйти:

CognitoUser.getCurrentUser().signOut()

Теперь, если я закрою приложение и открою приложение - CognitoUser.getCurrentUser (). GetUserId () по-прежнему возвращает моего ранее вошедшего в систему пользователя.

Несколько месяцев назад я выполнил реализацию AWS с 2.2. + В качестве версий sdk, и этот пример работал как ожидалось.

Примечание * Если я пытаюсь использовать CognitoUser.getCurrentUser (). GlobalSignout () - он возвращает ошибку «пользователь не аутентифицирован».

Как я могу проверить запуск приложения, если у меня есть действительный пользователь / сеанс? Я ненавижу, как AWS меняет вещи каждый день без документации или документации, которую невозможно найти.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Похоже, что это ошибка в AWS SDK.

У меня почти такая же проблема. Мои шаги:

 1. Sign in as user 1
 2. Sing out
 3. Sign in as user 2
 4. Surprise that user 1 is signed in instead of user 2

Итак, решили обновить до нового SDK

com.amazonaws:aws-android-sdk-mobile-client:2.13.4

который использует

implementation 'com.amazonaws:aws-android-sdk-core:2.13.4'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.13.4'
implementation 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.13.4'

Но это не помогает.

В ходе расследования было установлено, что

Проблема, связанная с файлом CognitoIdentityProviderCache.xml: /data/data/applicationId/shared_prefs/CognitoIdentityProviderCache.xml

Файл CognitoIdentityProviderCache.xml не очищается после выхода из системы.

Содержимое файла после примера выхода из системы:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted">...</string>
    <string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted.iv">...</string>
    <string name="CognitoIdentityProvider.app_id.LastAuthUser.encrypted.keyvaluestoreversion">1</string>
</map>

Устранение этой 3 строки из файла устраняет проблему.

Обходной путь:

  1. Очистить файл при выходе.

Но имя файла можно изменить в следующей версии.

  1. Очистить внутреннюю папку приложения. (применяется один)

Это то же самое, что нажать «Очистить данные» в Системных настройках -> Приложение -> AwesomeApp

 context.cacheDir.parentFile.deleteRecursively()

Вы можете следить за моими сообщениями об ошибках за подробностями на их трекере ошибок

https://github.com/aws-amplify/aws-sdk-android/issues/1015

0 голосов
/ 03 ноября 2018

signOut очищает кэшированные токены из SharedPreferences. Он очищает данные, хранящиеся под токенами доступа, идентификатора и обновления. Однако ключ LastAuthUser содержит идентификатор пользователя, который не очищается с помощью signOut.

Когда вы вызываете cognitoUserPool.getCurrentUser().getUserId(), он проверяет наличие ключа LastAuthUser в SharedPreferences, следовательно, он возвращает идентификатор пользователя. Я смотрю на проблему. Обновлю этот ответ, когда смогу подтвердить предполагаемое поведение.

...