AWS Cognito Sign Up Confirm with Node.js
Let's add AWS Cognito Sign Up Confirm function to the Node project today. I suppose your project already add AWS Cognito Sign Up to your project.
If not, please take a look at my provious articles:
Also, you can download the full codebase (opens in a new tab) here if you are interested in this AWS Cognito Sign Up Email Confirm.
Add a AWS Cognito Sign Up Email Confirm route
- Add /api/auth/email/verify (opens in a new tab) route in existing your node.js project, if don't use validateSignupRequest (opens in a new tab) middleware, then you can remove the
validateSignupRequest
middleware.
import controller from '../controllers/auth.controller';
import {
validateSignupRequest,
validateSignupConfirmRequest,
} from '../middleware';
export default (app) => {
app.post('/api/auth/signup', validateSignupRequest, controller.signup);
app.post(
'/api/auth/email/verify',
validateSignupConfirmRequest,
controller.signupConfirm,
);
};
Add a Sign Up Email Confirm Function in the auth controller.
- Add a Sign Up Email Confirm Function (opens in a new tab) in the controller.
// User Signup
import CognitoIdentity from '../services/cognito';
const CognitoIdentityService = CognitoIdentity();
const signup = async (req, res) => {
// Signup logic here
// ...
const { email, password, givenname, familyname } = req.body;
const cognitoParams = {
username: email,
password,
givenname,
familyname,
};
try {
const cognitoUser = await new Promise((resolve, reject) => {
CognitoIdentityService.signup(cognitoParams, (err, user) => {
if (err) {
reject(err);
} else {
resolve(user);
}
});
});
res.status(200).send({
success: true,
message: 'User registered successfully',
user: cognitoUser,
});
} catch (error) {
res.status(400).send({ success: false, message: error.message, error });
}
};
const signupConfirm = async (req, res) => {
const { email, code } = req.body;
const cognitoParams = {
username: email,
confirmationCode: code,
};
try {
await new Promise((resolve, reject) => {
CognitoIdentityService.signupConfirm(cognitoParams, (err, user) => {
if (err) {
reject(err);
} else {
resolve(user);
}
});
});
// DB logic here
// ...
res.status(200).send({
success: true,
message: 'User email confirmed successfully',
user: {
user_confirmed: true,
},
});
} catch (error) {
res.status(400).send({ success: false, message: error.message, error });
}
};
export default {
signup,
signupConfirm,
};
Add a Sign Up Email Confirm in the services.
And then we need to add the AWS Cognito user authentication service to the services folder. I will use the amazon-cognito-identity-js for the service. If you don't understand how to work the service, please check the service folder structure on my git repository (opens in a new tab).
services/
└──cognito/
├── index.js
└── methods/
├── index.js
├── signup.js
└── signupConfirm.js
This is a signupConfirm file, please add it.
import { CognitoUserPool, CognitoUser } from 'amazon-cognito-identity-js';
/**
* Confirm the signup action
* @param {*} poolData
* @param {{username, confirmationCode}} body
* @param {*} callback
*/
const signupConfirm = (poolData, body, callback) => {
const userPool = new CognitoUserPool(poolData);
const { username, confirmationCode } = body;
const userData = {
Username: username,
Pool: userPool,
};
const cognitoUser = new CognitoUser(userData);
cognitoUser.confirmRegistration(confirmationCode, true, (err, res) =>
callback(err, res),
);
};
export default signupConfirm;
The Result in the Postman
References
https://github.com/itwebtiger/express-amazon-cognito/tree/cognito-signupconfirm (opens in a new tab) https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-social-idp.html#cognito-user-pools-social-idp-step-1 (opens in a new tab)