gpt4 book ai didi

go - AWS Cognito 的 SMS 多因素身份验证返回无效代码或身份验证状态

转载 作者:行者123 更新时间:2023-12-01 18:58:08 27 4
gpt4 key购买 nike

我正在尝试实现基于 Cognito 的身份验证使用他们的 Go SDK .我已经能够得到基本的username/password身份验证工作,但是当我使用 SMS 添加 2 因素身份验证时我卡住了。

重现步骤 :

  • 我使用用户名/密码和电子邮件验证创建用户
  • 我验证电子邮件地址
  • 我设置了电话号码并请求验证码
  • 我验证电话号码
  • 我启用 2 因素身份验证(通过 SMS)
  • 我尝试登录并接收 SMS_MFA 挑战
  • 我在手机上收到验证码并调用 AdminRespondToAuthChallenge

  • 问题,我收到了 error :
    CodeMismatchException: Invalid code or auth state for the user.
    status code: 400, request id: 1513894e-8efa-11e8-a8f8-97e5e083c03b

    短信验证码肯定是对的,看来肯定是和auth状态有关。

    对 Cognito 的调用如下所示:
    c.cip.SignUp(&cognitoidentityprovider.SignUpInput{
    ClientId: aws.String(c.clientID),
    Username: aws.String(username),
    Password: aws.String(password),
    UserAttributes: []*cognitoidentityprovider.AttributeType{
    {
    Name: aws.String("email"),
    Value: aws.String(email),
    },
    {
    Name: aws.String("name"),
    Value: aws.String(fullName),
    },
    },
    })

    c.cip.ConfirmSignUp(&cognitoidentityprovider.ConfirmSignUpInput{
    ClientId: aws.String(c.clientID),
    Username: aws.String(username),
    ConfirmationCode: aws.String(code),
    })


    //Add the phone number
    c.cip.AdminUpdateUserAttributes(&cognitoidentityprovider.AdminUpdateUserAttributesInput{
    UserPoolId: aws.String(c.userPoolID),
    Username: aws.String(username),
    UserAttributes: []*cognitoidentityprovider.AttributeType{
    {
    Name: aws.String("phone_number"),
    Value: aws.String(phoneNumber),
    },
    },
    })

    //Request a verification code
    c.cip.GetUserAttributeVerificationCode(&cognitoidentityprovider.GetUserAttributeVerificationCodeInput{
    AccessToken: aws.String(accessToken),
    AttributeName: aws.String("phone_number"),
    })

    //Verify the phone number
    c.cip.VerifyUserAttribute(&cognitoidentityprovider.VerifyUserAttributeInput{
    AccessToken: aws.String(accessToken),
    AttributeName: aws.String("phone_number"),
    Code: aws.String(code),
    })

    //Enable SMS 2-factor auth c.cip.AdminSetUserSettings(&cognitoidentityprovider.AdminSetUserSettingsInput{
    UserPoolId: aws.String(c.userPoolID),
    Username: aws.String(username),
    MFAOptions: []*cognitoidentityprovider.MFAOptionType{
    &cognitoidentityprovider.MFAOptionType{
    AttributeName: aws.String("phone_number"),
    DeliveryMedium: aws.String("SMS"),
    },
    },
    })

    c.cip.AdminInitiateAuth(&cognitoidentityprovider.AdminInitiateAuthInput{
    ClientId: aws.String(c.clientID),
    UserPoolId: aws.String(c.userPoolID),
    AuthFlow: aws.String("ADMIN_NO_SRP_AUTH"),
    AuthParameters: map[string]*string{
    "USERNAME": aws.String(username),
    "PASSWORD": aws.String(password),
    },
    })

    c.cip.AdminRespondToAuthChallenge(&cognitoidentityprovider.AdminRespondToAuthChallengeInput{
    ClientId: aws.String(c.clientID),
    UserPoolId: aws.String(c.userPoolID),
    ChallengeName: aws.String("SMS_MFA"),
    Session: aws.String(session),
    ChallengeResponses: map[string]*string{
    "USERNAME": aws.String(username),
    "SMS_MFA_CODE": aws.String(code),
    },
    })

    执行 GetUser 调用会显示用户的当前状态:
    User = {
    Enabled: true,
    MFAOptions: [{
    AttributeName: "phone_number",
    DeliveryMedium: "SMS"
    }],
    PreferredMfaSetting: "SMS_MFA",
    UserAttributes: [
    {
    Name: "sub",
    Value: "bd2bb8bc-dfe6-4216-829c-5ae975ce24e5"
    },
    {
    Name: "email_verified",
    Value: "true"
    },
    {
    Name: "name",
    Value: "Ben Vogan"
    },
    {
    Name: "phone_number_verified",
    Value: "true"
    },
    {
    Name: "phone_number",
    Value: "<redacted>"
    },
    {
    Name: "email",
    Value: "<redacted>"
    }
    ],
    UserCreateDate: 2018-07-24 03:29:49 +0000 UTC,
    UserLastModifiedDate: 2018-07-24 04:19:51 +0000 UTC,
    UserMFASettingList: ["SMS_MFA"],
    UserStatus: "CONFIRMED",
    Username: "bd2bb8bc-dfe6-4216-829c-5ae975ce24e5"
    }

    我不知道是否有办法查询用户的身份验证状态,以便我可以验证。

    AWS 文档和无用的错误让我发疯,因此我们将不胜感激!

    谢谢。

    最佳答案

    你的问题似乎模棱两可。

    第 2 步你是

  • 我设置了电话号码并请求验证码
  • 我验证电话号码

  • 这不过是 Cognito 中的 MFA。如果您已正确配置池。

    您不能同时拥有用于登录和 MFA 的电话。那没有意义。

    但是如果你有手机登录,那么 Cognito 每次都会发送带有代码的短信。密码仅用于电子邮件登录。

    关于go - AWS Cognito 的 SMS 多因素身份验证返回无效代码或身份验证状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51490707/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com