没有密码的AWS Cognito用户池

spa*_*par 18 amazon-web-services amazon-cognito

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

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

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

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

谢谢 !!

Ash*_*han 17

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

  • 用户注册后(同时询问手机号码并强制要求),将手机号码,用户名和密码也存储在使用AWS KMS加密的Dynamodb中(为了提高安全性).
  • 您可以使用手机号码的MFA进行身份验证质询,以便在用户输入手机号码并按登录后(在前端),在后端您可以自动进行用户名密码匹配(直通)并触发MFA为用户的手机发送代码并验证使用AWS Cognito SDK(无需实施自定义移动消息和质询).
  • 如果您计划手动(不使用MFA)实施流程以发送SMS和验证,则可以使用AWS SNS进行此操作.

请查看以下代码示例以了解MFA的洞察力,并参阅此链接以获取更多详细信息.

    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);
        }

    });
Run Code Online (Sandbox Code Playgroud)

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

  • 在外部数据库中为每个用户存储唯一的随机密码而不是为所有用户仅拥有一个秘密的虚拟密码的安全性好处是什么? (2认同)

sur*_*yan 5

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

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

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

选项#1: - 用户无需用户名和密码即可注册。 认知设置

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

对于触发器代码,请参阅 具有多个登录选项的 aws 认知池


red*_*off 5

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

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

我的要求是,我希望后端使用A 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;
};
Run Code Online (Sandbox Code Playgroud)

创建身份验证挑战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;
};
Run Code Online (Sandbox Code Playgroud)

验证身份验证挑战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;
};
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用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);
  }
});
Run Code Online (Sandbox Code Playgroud)