Как настроить поток аутентификации пользователя AWS cognito для генерации токена идентификации, токена доступа в серверной части Java sdk?

#java #authentication #amazon-cognito #aws-userpools #access-keys

#java #аутентификация #amazon-cognito #aws-userpools #ключи доступа

Вопрос:

  1. Я использую аутентификацию AWS Cognito для механизма подписи. Чтобы получить учетные данные (токен доступа, секретный токен и токен сеанса), нам необходимо получить токен идентификации.
  2. У меня есть имя пользователя, пароль, идентификатор клиента, идентификатор пользовательского пула, информация identityPoolId. Однако, когда я пытаюсь сгенерировать токен идентификатора, используя USER_PASSWORD_AUTH в качестве типа потока аутентификации, я получаю следующую ошибку, вызванную: com.amazonaws.services.cognitoidp.model.Исключение AWSCognitoIdentityProviderException: отсутствует токен аутентификации (Service: AWSCognitoIdentityProvider; Код состояния: 400; Код ошибки: MissingAuthenticationTokenException; Идентификатор запроса: ; Прокси: null)

Ниже приведен код:

 AnonymousAWSCredentials awsCreds = new AnonymousAWSCredentials();

    AWSCognitoIdentityProvider provider = AWSCognitoIdentityProviderClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion(//region)
            .build();
           

    AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest()
            .withAuthFlow(AuthFlowType.USER_PASSWORD_AUTH)
            .withClientId("")
            .withUserPoolId("")
            .withAuthParameters(map);
    Map<String,String> map = new HashMap<>();
    map.put("USERNAME","");
    map.put("PASSWORD","");
  

Здесь карта будет иметь имя пользователя и пароль.

Может кто-нибудь помочь в настройке аутентификации в Java для генерации токена id и токена доступа? Заранее спасибо!!

Ответ №1:

Ваш код может выглядеть следующим образом. Пожалуйста, обратите внимание, что:

  1. Для аутентификации используется поток ADMIN_USER_PASSWORD_AUTH. Пожалуйста, смотрите AdminInitiateAuth

  2. В Cognito, в настройках клиента, в разделе «Конфигурация потоков аутентификации» должна быть включена следующая опция «Включить аутентификацию имени пользователя и пароля для API администратора для аутентификации (ALLOW_ADMIN_USER_PASSWORD_AUTH)».

      public static void auth(String username, String password) {
    
     AwsBasicCredentials awsCreds = AwsBasicCredentials.create(AWS_KEY,
             AWS_SECRET);
    
     CognitoIdentityProviderClient identityProviderClient =
             CognitoIdentityProviderClient.builder()
                     .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
                     .region(Region.of(REGION))
                     .build();
    
     final Map<String, String> authParams = new HashMap<>();
     authParams.put("USERNAME", username);
     authParams.put("PASSWORD", password);
     authParams.put("SECRET_HASH", calculateSecretHash(CLIENT_ID,
             CLIENT_SECRET, username));
    
     final AdminInitiateAuthRequest authRequest = AdminInitiateAuthRequest.builder()
             .authFlow(AuthFlowType.ADMIN_USER_PASSWORD_AUTH)
             .clientId(CLIENT_ID)
             .userPoolId(POOL_ID)
             .authParameters(authParams)
             .build();
    
     AdminInitiateAuthResponse result = identityProviderClient.adminInitiateAuth(authRequest);
    
     System.out.println(result.authenticationResult().accessToken());
     System.out.println(result.authenticationResult().idToken());
      

    }

  3. Метод calculateSecretHash взят из документации AWS Регистрация и подтверждение учетных записей пользователей:

      private static String calculateSecretHash(String userPoolClientId, String userPoolClientSecret, String userName) {
     final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
    
     SecretKeySpec signingKey = new SecretKeySpec(
             userPoolClientSecret.getBytes(StandardCharsets.UTF_8),
             HMAC_SHA256_ALGORITHM);
     try {
         Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
         mac.init(signingKey);
         mac.update(userName.getBytes(StandardCharsets.UTF_8));
         byte[] rawHmac = mac.doFinal(userPoolClientId.getBytes(StandardCharsets.UTF_8));
         return Base64.getEncoder().encodeToString(rawHmac);
     } catch (Exception e) {
         throw new RuntimeException("Error while calculating ");
     }}