具有多个登录选项的 aws cognito 池
aws cognito pool with multiple sign in options
我有一个移动应用程序,想使用 AWS Cognito 池进行用户管理(注册并登录)。我想为用户提供以下 3 个选项来登录我的应用程序
- 用户名、密码
使用 OTP 登录的 - phone 号码 - 在登录屏幕上,用户输入他的 phone 号码,Cognito 应该发送 OTP 代码,并且在验证时,它应该允许登录
- Google 连接登录
在注册期间,用户将设置用户名、密码并添加经过验证的 phone 号码,并且他们可以选择将 google 连接到他们的个人资料。
如何为这种情况设置 Cognito 池,用户可以选择以上 3 个选项中的任何一个来登录应用程序?
我找到了一种设置 Cognito 以允许多个登录选项的方法。
像下面这样设置 Cognito
1. select 使用 phone 号码作为用户名
2. 使其具有强制性和可验证性。
3. 这将使 phone_number 作为登录的别名。
使用 CUSTOM_CHALLENGE 选项配置带有 OTP 的 phone 号码登录。
基本上,我们需要在 Cognito 中配置 3 个触发器,以将 OTP 发送到用户注册号码。
1.登录定义auth challenge trigger -- define CUSTOM_CHALLENGE
2. 登录创建身份验证挑战触发器——创建逻辑以生成 OTP 并使用 SNS 服务发送短信
3. 登录验证身份验证挑战触发器 -- 验证收到的 OTP,生成的 OTP 将在上下文中可用,因此无需保存在任何数据库中。
触发器#1 - 定义身份验证挑战
exports.handler = (event, context, callback) => {
if (event.request.session.length == 0){
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'CUSTOM_CHALLENGE';
} else if(event.request.session.length == 1
&& event.request.session[0].challengeName == 'CUSTOM_CHALLENGE'
&& event.request.session[0].challengeResult == true){
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
event.response.issueTokens = false;
event.response.failAuthentication = true;
}
// Return to Amazon Cognito
callback(null, event);
}
触发器#2 - 创建身份验证挑战确保此 lambda 具有 SNS 角色
var AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
if (event.request.session.length == 0 && event.request.challengeName == 'CUSTOM_CHALLENGE') {
//create the code
var answer = Math.random().toString(10).substr(2,6);
//send the code via Amazon SNS Global SMS
var sns = new AWS.SNS();
sns.publish({
Message: 'your verification code is '+answer,
PhoneNumber: event.request.userAttributes.phone_number
}, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
return;
}
console.log('SMS Sent'); // successful response
});
//set the return parameters **including the correct answer**
event.response.publicChallengeParameters = {};
event.response.privateChallengeParameters = {};
event.response.privateChallengeParameters.answer = answer;
event.response.challengeMetadata = 'PASSWORDLESS_CHALLENGE';
}
//Return to Amazon Cognito
callback(null, event);
}
触发器#3 - 验证身份验证质询响应
exports.handler = (event, context, callback) => {
if (event.request.privateChallengeParameters.answer == event.request.challengeAnswer) {
event.response.answerCorrect = true;
} else {
event.response.answerCorrect = false;
}
// Return to Amazon Cognito
callback(null, event);
}
我有一个移动应用程序,想使用 AWS Cognito 池进行用户管理(注册并登录)。我想为用户提供以下 3 个选项来登录我的应用程序
- 用户名、密码 使用 OTP 登录的
- phone 号码 - 在登录屏幕上,用户输入他的 phone 号码,Cognito 应该发送 OTP 代码,并且在验证时,它应该允许登录
- Google 连接登录
在注册期间,用户将设置用户名、密码并添加经过验证的 phone 号码,并且他们可以选择将 google 连接到他们的个人资料。
如何为这种情况设置 Cognito 池,用户可以选择以上 3 个选项中的任何一个来登录应用程序?
我找到了一种设置 Cognito 以允许多个登录选项的方法。 像下面这样设置 Cognito 1. select 使用 phone 号码作为用户名 2. 使其具有强制性和可验证性。 3. 这将使 phone_number 作为登录的别名。
使用 CUSTOM_CHALLENGE 选项配置带有 OTP 的 phone 号码登录。
基本上,我们需要在 Cognito 中配置 3 个触发器,以将 OTP 发送到用户注册号码。 1.登录定义auth challenge trigger -- define CUSTOM_CHALLENGE 2. 登录创建身份验证挑战触发器——创建逻辑以生成 OTP 并使用 SNS 服务发送短信 3. 登录验证身份验证挑战触发器 -- 验证收到的 OTP,生成的 OTP 将在上下文中可用,因此无需保存在任何数据库中。
触发器#1 - 定义身份验证挑战
exports.handler = (event, context, callback) => {
if (event.request.session.length == 0){
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'CUSTOM_CHALLENGE';
} else if(event.request.session.length == 1
&& event.request.session[0].challengeName == 'CUSTOM_CHALLENGE'
&& event.request.session[0].challengeResult == true){
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
event.response.issueTokens = false;
event.response.failAuthentication = true;
}
// Return to Amazon Cognito
callback(null, event);
}
触发器#2 - 创建身份验证挑战确保此 lambda 具有 SNS 角色
var AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
if (event.request.session.length == 0 && event.request.challengeName == 'CUSTOM_CHALLENGE') {
//create the code
var answer = Math.random().toString(10).substr(2,6);
//send the code via Amazon SNS Global SMS
var sns = new AWS.SNS();
sns.publish({
Message: 'your verification code is '+answer,
PhoneNumber: event.request.userAttributes.phone_number
}, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
return;
}
console.log('SMS Sent'); // successful response
});
//set the return parameters **including the correct answer**
event.response.publicChallengeParameters = {};
event.response.privateChallengeParameters = {};
event.response.privateChallengeParameters.answer = answer;
event.response.challengeMetadata = 'PASSWORDLESS_CHALLENGE';
}
//Return to Amazon Cognito
callback(null, event);
}
触发器#3 - 验证身份验证质询响应
exports.handler = (event, context, callback) => {
if (event.request.privateChallengeParameters.answer == event.request.challengeAnswer) {
event.response.answerCorrect = true;
} else {
event.response.answerCorrect = false;
}
// Return to Amazon Cognito
callback(null, event);
}