#java #authentication #amazon-cognito #aws-userpools #access-keys
#java #аутентификация #amazon-cognito #aws-userpools #ключи доступа
Вопрос:
- Я использую аутентификацию AWS Cognito для механизма подписи. Чтобы получить учетные данные (токен доступа, секретный токен и токен сеанса), нам необходимо получить токен идентификации.
- У меня есть имя пользователя, пароль, идентификатор клиента, идентификатор пользовательского пула, информация 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:
Ваш код может выглядеть следующим образом. Пожалуйста, обратите внимание, что:
-
Для аутентификации используется поток ADMIN_USER_PASSWORD_AUTH. Пожалуйста, смотрите AdminInitiateAuth
-
В 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());
}
-
Метод 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 "); }}