Amazon Cognito RespondToAuthChallenge - возвращает NotAuthorizedException, Неверное имя пользователя или пароль.

В пулах пользователей когнито у меня есть две разные группы: администраторы и пользователи. Я хочу разрешить администраторам создавать пользователей когнитивных систем, поэтому я создал нового пользователя с помощью метода AdminCreateUser класса CognitoIdentityServiceProvider. Ссылка - https://docs.aws.amazon.com/cognito/latest/developerguide/how-to-create-user-accounts.html.

Теперь я хочу авторизовать пользователя в userpool. Я перехожу по этой ссылке - https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html - процесс аутентификации на стороне клиента. Но «RespondToAuthChallenge» - возвращает NotAuthorizedException, Неверное имя пользователя или пароль.

import * as AWS from 'aws-sdk'
import { SRPClient, calculateSignature, getNowString } from 'amazon-user-pool-srp-client'


const userPoolId = 'XXX'
const ClientId = 'XXX'

const verifyUser = () => {
    AWS.config.region = 'us-west-2'
    const srp = new SRPClient(userPoolId)
    const SRP_A = srp.calculateA()
    var params = {
      AuthFlow: 'USER_SRP_AUTH',
      ClientId,
      AuthParameters: {
        USERNAME: formState.email,
        SRP_A,
      },
    }
    let cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider()
    cognitoidentityserviceprovider.initiateAuth(params, function (err, data) {
      if (err) {
        const error = err.message ? err.message : err
        console.log(error)
      }
      else {
        console.log(data) // --> data.session is undefined
        if (data.ChallengeParameters && data.ChallengeName) {
          const passwordAuthenticationKey =
            srp.getPasswordAuthenticationKey(
              data.ChallengeParameters.USER_ID_FOR_SRP,
              formState.password,
              data.ChallengeParameters.SRP_B,
              data.ChallengeParameters.SALT
            )
          const dateNow = getNowString()
          const signatureString = calculateSignature(
            passwordAuthenticationKey,
            userPoolId,
            data.ChallengeParameters.USER_ID_FOR_SRP,
            data.ChallengeParameters.SECRET_BLOCK, dateNow
          )

          var params = {
            ChallengeName: data.ChallengeName,
            ClientId,
            ChallengeResponses: {
              // PASSWORD_VERIFIER
              PASSWORD_CLAIM_SIGNATURE: signatureString,
              PASSWORD_CLAIM_SECRET_BLOCK: data.ChallengeParameters.SECRET_BLOCK,
              TIMESTAMP: dateNow,
              USERNAME: data.ChallengeParameters.USER_ID_FOR_SRP,
            },
            Session: data.Session, // undefined
          };
          cognitoidentityserviceprovider.respondToAuthChallenge(params, function (err, data) {
            if (err) {
              const error = err.message ? err.message : err
              console.log(error) // Incorrect username or password
            }
            else {
              console.log(data)
            }
          })
        }
      }
    })
  }

Я создал пользователей diff, но безуспешно. Пользователь регистрируется, но responseToAuthChallenge выдает ошибку. Ответ InitiateAuth возвращает параметры ChallengeName и Challenge, но сеанс не указан.

Я нашел это утверждение, которое я не могу понять - когда выполняется следующая операция подтверждения пароля RespondToAuthChallenge, Amazon Cognito возвращает общую ошибку NotAuthorizedException, указывающую, что имя пользователя или пароль неверны. в https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-managing-errors.html.

Пожалуйста, дайте мне знать, если у вас есть какое-либо решение / идея, спасибо !!


person Madhuri    schedule 16.12.2020    source источник


Ответы (1)


Во-первых, поле Session не является обязательным на основе RespondToAuthChallenge, поэтому вам может даже не потребоваться передавать его для запроса PASSWORD_VERIFIER, если он не предоставлен.

во-вторых, можете ли вы включить полное сообщение об ошибке и ответы, которые вы получаете от операций initiateAuth и responseToAuthChallenge, чтобы я мог посмотреть?

Также имейте в виду, что поле сеанса в ответе от операции initiateAuth - это сеанс с заглавной буквой S (вот документ для initiateAuth operation), поэтому вместо data.session вам нужно получить значение сеанса с data.Session.

person Sina    schedule 09.04.2021
comment
Привет, @Sina, не могли бы вы также взглянуть на это - заголовок stackoverflow.com/questions/68388290/ Я столкнулся с аналогичной проблемой и не могу определить ее основную причину. - person Harshit Laddha; 15.07.2021