How to allow the login to the user which is created by admin in the aws-cognito user pool

Viewed 27

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);
};
0 Answers
Related