Я добавил MFA для пользователя на консоли Cognito, и когда я делаю вход в систему через мой Java SDK, он находит вызов SMS_MFA, поэтому я получаю OTP при входе в систему. Однако я даю OTP и пытаюсь войти в систему, и снова я получаю новый OTP, в результате чего я получаю Исключение Codemismatch. Я дал код здесь. Это и проблема со стороны AWS?
Я добавил код, который обрабатывает вызов, вместе с кодом, который выполняет вход
общедоступный вход SpringSecurityUser (AuthenticateRequest authenticateRequest) {
AuthenticationResultType authenticationResult = null;
AWSCognitoIdentityProvider cognitoClient = getAWSCognitoIdentityProvider();
try {
final Map<String, String> authParams = new HashMap<>();
authParams.put(USERNAME, authenticateRequest.getUsername());
authParams.put(PASS_WORD, authenticateRequest.getPassword());
String sessionResult= null;
final AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest();
authRequest.withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH)
.withClientId(clientId)
.withUserPoolId(userPoolId)
.withAuthParameters(authParams);
AdminInitiateAuthResult result = cognitoClient.adminInitiateAuth(authRequest);
if (StringUtils.isNotBlank(result.getChallengeName())) {
if (SMS_MFA.equals(result.getChallengeName())) {
if (null == authenticateRequest.getPassword()) {
throw new CognitoException("User must provide a new password", CognitoException.USER_MUST_CHANGE_PASS_WORD_EXCEPTION_CODE, result.getChallengeName());
} else {
final Map<String, String> challengesResponse = new HashMap<>();
challengesResponse.put(USERNAME, authenticateRequest.getUsername());
challengesResponse.put(PASS_WORD, authenticateRequest.getPassword());
challengesResponse.put(SMS_MFA_CODE, authenticateRequest.getMfaCode());
final AdminRespondToAuthChallengeRequest requestChallenge = new AdminRespondToAuthChallengeRequest();
requestChallenge
.withChallengeName(ChallengeNameType.SMS_MFA)
.withChallengeResponses(challengesResponse)
.withClientId(clientId)
.withUserPoolId(userPoolId)
.withSession(result.getSession());
AdminRespondToAuthChallengeResult requestChallengeResponse = cognitoClient.adminRespondToAuthChallenge(requestChallenge);
authenticationResult = requestChallengeResponse.getAuthenticationResult();
}
} else {
throw new CognitoException(result.getChallengeName(), CognitoException.USER_MUST_DO_ANOTHER_CHALLENGE, result.getChallengeName());
}
} else {
authenticationResult = result.getAuthenticationResult();
}
SpringSecurityUser userAuthenticated = new SpringSecurityUser(authenticateRequest.getUsername(), authenticateRequest.getPassword(), authenticateRequest.getMfaCode(), null, null, null);
userAuthenticated.setAccessToken(authenticationResult.getAccessToken());
userAuthenticated.setExpiresIn(authenticationResult.getExpiresIn());
userAuthenticated.setTokenType(authenticationResult.getTokenType());
userAuthenticated.setRefreshToken(authenticationResult.getRefreshToken());
userAuthenticated.setIdToken(authenticationResult.getIdToken());
log.info("User authenticated" + authenticateRequest.getUsername());
return userAuthenticated;
Я ожидаю, что код ответит challeneg и выдаст токены и данные пользователя, однако я получаю исключение CodeMismatch.