I want that only admin should create the user. If the user does not exist then login should be denied. I have created a user pool which takes phone_number as a username and does passwordless login which is using amplify. with these lambdas it is possible to login even if user does not exist. can anyone suggest me a way out for this.
pre-signUp lambda trigger
exports.handler = (event, context, callback) => {
// Confirm the user
console.log(event);
event.response.autoConfirmUser = true;
// Set the email as verified if it is in the request
if (event.request.userAttributes.hasOwnProperty("email")) {
event.response.autoVerifyEmail = true;
}
// Set the phone number as verified if it is in the request
if (event.request.userAttributes.hasOwnProperty("phone_number")) {
event.response.autoVerifyPhone = true;
}
// Return to Amazon Cognito
callback(null, event);
};
Define Auth Challenge
exports.handler = (event, context) = >{
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;
}
}
context.done(null, event);
};
Create Auth Challenge
const AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
//Create a random number for otp
const challengeAnswer = Math.random().toString(10).substr(2, 6);
const phoneNumber = event.request.userAttributes.phone_number;
//For Debugging
console.log(event, context);
//sns sms
const sns = new AWS.SNS({ region: "us-east-1" });
sns.publish(
{
Message: "Hey, " + phoneNumber + " your OTP is:" + challengeAnswer,
PhoneNumber: phoneNumber,
MessageStructure: "string",
MessageAttributes: {
"AWS.SNS.SMS.SenderID": {
DataType: "String",
StringValue: "AMPLIFY",
},
"AWS.SNS.SMS.SMSType": {
DataType: "String",
StringValue: "Transactional",
},
},
},
function (err, data) {
if (err) {
console.log(err.stack);
console.log(data);
return;
}
console.log(`SMS sent to ${phoneNumber} and otp = ${challengeAnswer}`);
return data;
}
);
//set return params
event.response.privateChallengeParameters = {};
event.response.privateChallengeParameters.answer = challengeAnswer;
event.response.challengeMetadata = "CUSTOM_CHALLENGE";
callback(null, event);
};
Verify Auth
exports.handler = (event, context) => {
console.log(event);
if (
event.request.privateChallengeParameters.answer ===
event.request.challengeAnswer
) {
event.response.answerCorrect = true;
} else {
event.response.answerCorrect = false;
}
context.done(null, event);
};