Усиление аутентификации и Android: временные учетные данные — ключ доступа, секретный ключ недействителен в postman

#android #authentication #postman #credentials #amplify

#Android #аутентификация #почтальон #учетные данные #aws-усиление

Вопрос:

я настроил приложение для Android для использования усиления аутентификации.

я разрешил ему принимать неавторизованных (гостевых) пользователей и федеративный вход в Google.

кажется, все работает так, как ожидалось. я могу войти в систему, используя Google sign in и cognito.

у меня возникла проблема с использованием временных учетных данных, сгенерированных для входа в Google и гостевого пользователя.

я настроил api в apigateway (пример pet, импортированный в мой apigateway). я могу получить доступ к конечной точке с помощью пользователя с политикой, разрешающей вызывать api. я тестирую в postman, используя users accessKey и SecretKey, и это работает.

это также работает, когда я использую идентификатор пользователя, вошедшего в систему cognito.

(я добавил разрешить вызов api в политики ролей авторизации и авторизации для используемого пула удостоверений)

если я использую ключ доступа и секретный ключ, сгенерированные для гостя с помощью этого кода:

  public void getGuestCredentials(View view) {
    Log.i(TAG, "inside getGuestCredentials()...");
    Amplify.Auth.fetchAuthSession(
            result -> {
                AWSCognitoAuthSession cognitoAuthSession = (AWSCognitoAuthSession) resu<
                Log.i(TAG, "Is user signed in: " cognitoAuthSession.isSignedIn());

                switch(cognitoAuthSession.getIdentityId().getType()) {
                    case SUCCESS:
                        Log.i(TAG, "success IdentityId: "   cognitoAuthSession.getIdentityId().getValue());
                        Log.i(TAG, "success access key: "   cognitoAuthSession.getAWSCredentials().getValue().getAWSAccessKeyId());
                        Log.i(TAG, "success secret key: "   cognitoAuthSession.getAWSCredentials().getValue().getAWSSecretKey());
                        break;
                    case FAILURE:
                        Log.i(TAG, "failure IdentityId not present because: "   cognitoAuthSession.getIdentityId().getError().toString());
                        break;
                    default:
                        Log.i(TAG, "default IdentityId: "   cognitoAuthSession.getIdentityId().getValue());
                        Log.i(TAG, "default access key: "   cognitoAuthSession.getAWSCredentials().getValue().getAWSAccessKeyId());
                        Log.i(TAG, "default secret key: "   cognitoAuthSession.getAWSCredentials().getValue().getAWSSecretKey());
                        break;

                }
            },
            error -> Log.i("AuthQuickStart", error.toString())
    );
  

Я получаю:

«сообщение»: «Маркер безопасности, включенный в запрос, недействителен».

в postman.

то же самое с ключами, сгенерированными для входа в Google с использованием этого кода:

 //            sign in as federated user using google token (using escape hatch)
        AWSMobileClient mobileClient = (AWSMobileClient) Amplify.Auth.getPlugin("awsCognitoAuthPlugin").getEscapeHatch();
  

// mobileClient.federatedSignIn(IdentityProvider.GOOGLE.toString(), account.getIdToken(), новый обратный вызов() {
mobileClient.federatedSignIn(«accounts.google.com «, account.getIdToken(), новый обратный вызов() {

             @Override
            public void onResult(final UserStateDetails userStateDetails) {
                //Handle the result
                Log.i(TAG, "mobileClient login result: "   userStateDetails.getUserState().toString());
                Log.i(TAG, "success google federation, going to authenticated user page.... ");
  

// ************************************************

                 AWSCredentials credentials = mobileClient.getCredentials();
                Log.i(TAG, "***** secret key: " credentials.getAWSSecretKey());
                Log.i(TAG, "***** access key: " credentials.getAWSAccessKeyId());
  

….

ценю любую помощь в решении этой проблемы. Спасибо

Ответ №1:

удалось разобраться.

«Когда вы совершаете вызов, используя временные учетные данные безопасности, вызов должен включать токен сеанса, который возвращается вместе с этими временными учетными данными. AWS использует токен сеанса для проверки временных учетных данных безопасности. Срок действия временных учетных данных истекает через указанный интервал».

я получил sessionToken, используя этот код:

 ((AWSSessionCredentials) AWSMobileClient.getInstance().getCredentials()).getSessionToken();