没有密码的AWS Cognito用户池

时间:2017-08-14 02:47:05

标签: amazon-web-services amazon-cognito

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

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

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

如果这是最好的方法,请告诉我:(我是AWS的新手,我无法找到此方案的任何帖子。

谢谢!

3 个答案:

答案 0 :(得分:14)

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

  • 用户注册后(同时询问手机号码并强制要求),将手机号码,用户名和密码也存储在使用AWS KMS加密的Dynamodb中(为了提高安全性)。
  • 您可以使用带有手机号码的MFA进行身份验证质询,以便在用户输入手机号码并按登录后(在前端),在后端您可以自动进行用户名密码匹配(Passthrough)并触发MFA发送代码用户的移动设备并验证是否使用AWS Cognito SDK(无需实施自定义移动消息和质询)。
  • 如果您打算手动实施流程(不使用MFA)发送短信&验证,您可以使用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,但可以作为满足您要求的解决方法。

答案 1 :(得分:1)

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

选项#1:-用户使用用户名和密码进行注册。

  1. 设置认知触发器-我们可以使用lambda函数。
  2. A。创建身份验证挑战 B.定义身份验证挑战 C.验证身份验证质询响应
  3. 客户端应用应实施CUSTOM_CHALLENGE身份验证流程。
  4. 要求用户输入注册的电话号码,并在用户名字段中传递此号码。触发器B将理解请求并将流程传递给触发器A,触发器A将生成随机代码5。使用AWS SNS服务将SMS发送到用户手机号码
  5. 触发器C将验证OTP并允许登录 要考虑的要点: 一种。将电话号码设置为别名(选择“也允许使用已验证的电话号码登录”) b。将电话号码字段设置为可验证的(这允许用户接收OTP)

选项1:-用户注册时无需输入用户名和密码。 认知设置

  1. 将电话号码设置为别名(选择“也允许使用已验证的电话号码登录”
  2. 使电话号码字段为可验证的(这使用户可以接收OTP)
  3. 在注册过程中,不要求用户提供用户名和密码,只需询问电话号码
  4. 为用户名和密码生成唯一的UUID,并将其与电话号码一起传递给认知
  5. Cognito将OTP代码发送给用户以进行帐户确认。
  6. 具有OTP登录设置触发器的电话号码,如以上选项所述。

有关触发器代码,请参阅 aws cognito pool with multiple sign in options

答案 2 :(得分:0)

这与OP使用单个秘密的要求稍有不同,但是我认为这可能会帮助其他解决此问题的人。

我能够通过为Cognito触发器创建自定义lambda来做到这一点:定义身份验证质询,创建身份验证质询和验证身份质询。

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

定义身份验证挑战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;
};

创建身份验证挑战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;
};

验证身份验证挑战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;
};

然后,我能够使用amazon-cognito-identity-js使用一些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);
  }
});