首页 文章

没有密码的AWS Cognito用户池

提问于
浏览
13

我想使用一个电话号码作为我的应用程序的用户名,我希望能够通过每次他们想要登录时验证电话号码来简化注册 - 没有杂乱的密码记住业务 .

如何使用AWS Cognito User Pool执行此操作,因为它要求我强制为每个用户配置密码 .

我想为每个用户使用虚拟密码并配置强制用户验证 . 每次用户退出时,我都可以“取消验证”用户,以便下次自动要求他们验证电话号码 . 此外,如果用户已经过验证,我会将我的应用程序连接到“登录” .

如果这是最好的方法,请告诉我:(我是AWS的新手,我找不到这个场景的任何帖子 .

谢谢 !!

3 回答

  • 13

    由于AWS Cognito目前不支持无密码身份验证,因此您需要使用外部存储的随机密码实施变通方法 . 您可以按如下方式实现身份验证流程 .

    • 用户注册后(同时询问手机号码并强制要求),将手机号码,用户名和密码也存储在使用AWS KMS加密的Dynamodb中(为了提高安全性) .

    • 您可以使用手机号码的MFA进行身份验证质询,以便在用户输入手机号码并按登录后(在前端),在后端您可以自动进行用户名密码匹配(直通)并触发MFA为用户发送代码移动并验证使用AWS Cognito SDK(无需实施自定义移动消息和质询) .

    • 如果您计划手动(不使用MFA)实施流程以发送SMS和验证,则可以使用AWS SNS进行此操作 .

    请查看以下代码示例以了解MFA的见解,并参阅this link以获取更多详细信息 .

    var userData = { 
            Username : 'username',
            Pool : userPool
        };
    
        cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
    
        var authenticationData = {
            Username : 'username',
            Password : 'password',
        };
    
        var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
    
        cognitoUser.authenticateUser(authenticationDetails, {
            onSuccess: function (result) {
                alert('authentication successful!')
            },
    
            onFailure: function(err) {
                alert(err);
            },
    
            mfaRequired: function(codeDeliveryDetails) {
                var verificationCode = prompt('Please input verification code' ,'');
                cognitoUser.sendMFACode(verificationCode, this);
            }
    
        });
    

    注意:此处带有手机号码的MFA不会用于MFA,而是作为满足您要求的解决方法 .

  • 0

    这可能有效,但考虑到安全性,在dynamoDB中存储密码可能会有问题 . 相反,我们可以尝试这样:

    option#1: - user sign ups with username and password.

    • setup cognito触发器 - 我们可以使用lambda函数 .

    • A.创建验证挑战B.定义验证挑战C.验证验证验证响应

    • 客户端应用程序应实现CUSTOM_CHALLENGE身份验证流程 .

    • 要求用户输入注册的电话号码,在用户名字段中传递 . 触发器B将理解请求并将流传递给触发器A,触发器A将生成随机代码5.使用AWS SNS服务向用户移动号码发送短信

    • 触发器C将验证OTP并允许登录点考虑:a . 将电话号码设置为别名(选择也允许使用经过验证的电话号码登录)b . 使电话号码字段可验证(这允许用户接收OTP)

    option#1: - user sign ups without username and password. cognito设置

    • 设置电话号码作为别名(选择也允许使用经过验证的电话号码登录)

    • 使电话号码字段可验证(这允许用户接收OTP)
      注册时

    • 不要求用户提供用户名和密码,只需询问电话号码即可

    • 生成用户名和密码的UUID是唯一的,并将这些与电话号码一起传递给cognito

    • Cognito向用户发送OTP代码以进行帐户确认 .

    • 用于具有OTP登录设置触发器的电话号码,如上述选项中所述 .

    对于触发器代码,请参考aws cognito pool with multiple sign in options

  • 1

    这与OP要求的内容略有不同,因为它使用了一个秘密,但我认为这可能有助于其他人提出这个问题 .

    我能够通过为Cognito触发器创建自定义lambda来实现此目的:定义Auth挑战,创建Auth挑战并验证Auth挑战 .

    我的要求是我希望我的后端使用 secret 然后为任何Cognito用户获取访问和刷新令牌 .

    Define Auth Challenge Lambda

    exports.handler = async event => {
      if (
        event.request.session &&
        event.request.session.length >= 3 &&
        event.request.session.slice(-1)[0].challengeResult === false
      ) {
        // The user provided a wrong answer 3 times; fail auth
        event.response.issueTokens = false;
        event.response.failAuthentication = true;
      } else if (
        event.request.session &&
        event.request.session.length &&
        event.request.session.slice(-1)[0].challengeResult === true
      ) {
        // The user provided the right answer; succeed auth
        event.response.issueTokens = true;
        event.response.failAuthentication = false;
      } else {
        // The user did not provide a correct answer yet; present challenge
        event.response.issueTokens = false;
        event.response.failAuthentication = false;
        event.response.challengeName = 'CUSTOM_CHALLENGE';
      }
      return event;
    };
    

    Create Auth Challenge Lambda

    exports.handler = async event => {
      if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
        // The value set for publicChallengeParameters is arbitrary for our
        // purposes, but something must be set
        event.response.publicChallengeParameters = { foo: 'bar' };
      }
      return event;
    };
    

    Verify Auth Challenge Lambda

    exports.handler = async event => {
      if (event.request.challengeName == 'CUSTOM_CHALLENGE') {
        // The value set for publicChallengeParameters is arbitrary for our
        // purposes, but something must be set
        event.response.publicChallengeParameters = { foo: 'bar' };
      }
      return event;
    };
    

    然后我可以使用一些JS,使用amazon-cognito-identity-js来提供秘密并获取令牌:

    var authenticationData = {
      Username : 'username'
    };
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
    var poolData = {
      UserPoolId : '...', // Your user pool id here
      ClientId : '...' // Your client id here
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
      Username : 'username',
      Pool : userPool
    };
    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
    
    cognitoUser.setAuthenticationFlowType('CUSTOM_AUTH');
    
    cognitoUser.initiateAuth(authenticationDetails, {
      onSuccess: function(result) {
        // User authentication was successful
      },
      onFailure: function(err) {
        // User authentication was not successful
      },
      customChallenge: function(challengeParameters) {
        // User authentication depends on challenge response
        var challengeResponses = 'secret'
        cognitoUser.sendCustomChallengeAnswer(challengeResponses, this);
      }
    });
    

相关问题