Войдите в систему с помощью вызова sms_mfa на Cognito и снова отправьте OPP. - PullRequest
0 голосов
/ 11 июня 2019

Я добавил 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.

...