Robię aplikację przy użyciu AWS Cognito i Spring Boot. Po rejestracji użytkownicy potwierdzają swoje konto przez e-mail lub kod aktywacyjny SMS. Po potwierdzeniu ich konta mogę zrobić automatyczną login sesji? Czy mogę rozpocząć sesję bez hasła tylko w przypadku przypadków potwierdzających?

0
Mauro Valc 23 lipiec 2020, 01:05

1 odpowiedź

Najlepsza odpowiedź

Tak, możesz wykonać logowanie dla użytkownika bez hasła za pomocą Niestandardowy przepływ uwierzytelniania.

Będziesz musiał dodać Lambda Triggers Aby obsłużyć niestandardowy przepływ autoryzacji. W aplikacji musisz używać AdminItiatuuth Call API.

Oto kilka przykładów kodu, aby zrozumieć ogólną ideę:

public void auth(String username) {

    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("SECRET_HASH", calculateSecretHash(CLIENT_ID,
            CLIENT_SECRET, username));

    final AdminInitiateAuthRequest authRequest = AdminInitiateAuthRequest.builder()
            .authFlow(AuthFlowType.CUSTOM_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());
}

private 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 ");
    }
}

Musisz także dodać zależności dla AWS SDK:

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>aws-core</artifactId>
  <version>2.13.57</version>
</dependency>

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>cognitoidentityprovider</artifactId>
  <version>2.13.57</version>
</dependency>

I dodaj Lambda dla "Define Auth Challenge" wyzwalacza basenu użytkownika:

exports.handler = async (event) => {
  // Don't do any checks just say that authentication is successfull
  event.response.issueTokens = true;
  event.response.failAuthentication = false;
  return event;
};
2
Yuriy P 23 lipiec 2020, 09:10