DEV Community

Chris Wang
Chris Wang

Posted on

2

AWS Cognito Sign In with Node.js

Let's add AWS Cognito Sign In 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 here for AWS Cognito Signin if you are interested in this AWS Cognito Sign In.

Add a AWS Cognito Sign In route



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,
  );
  app.post('/api/auth/signin', validateSigninRequest, controller.signin); // add signin route
};


Enter fullscreen mode Exit fullscreen mode

Add a Sign In Function in the auth controller.



// User Signup
import CognitoIdentity from '../services/cognito';

const CognitoIdentityService = CognitoIdentity();

const signin = async (req, res) => {
  const { email, password } = req.body;
  const cognitoParams = {
    username: email,
    password,
  };

  try {
    const cognitoUser = await new Promise((resolve, reject) => {
      CognitoIdentityService.signin(cognitoParams, (err, user) => {
        if (err) {
          reject(err);
        } else {
          resolve(user);
        }
      });
    });

    // DB logic here
    // ...

    res.status(200).send({
      success: true,
      message: 'User logined successfully',
      user: cognitoUser,
    });
  } catch (error) {
    res.status(400).send({ success: false, message: error.message, error });
  }
};

export default {
  signup,
  signupConfirm,
  signin, // add
};


Enter fullscreen mode Exit fullscreen mode

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.



services/
  └──cognito/
        ├── index.js
        └── methods/
              ├── index.js
              ├── signup.js
              ├── signin.js // add
              └── signupConfirm.js



Enter fullscreen mode Exit fullscreen mode

This is a signin file, please add it.



import {
CognitoUserPool,
CognitoUser,
AuthenticationDetails,
} from 'amazon-cognito-identity-js';

/**

  • Signin
  • @param {*} poolData
  • @param {{username, password}} body
  • @param {*} callback */

const signin = (poolData, body, callback) => {
const userPool = new CognitoUserPool(poolData);

const { username, password } = body;

const authenticationData = {
Username: username,
Password: password,
};

const authenticationDetails = new AuthenticationDetails(authenticationData);

const userData = {
Username: username,
Pool: userPool,
};

const cognitoUser = new CognitoUser(userData);

cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (res) => {
const data = {
refreshToken: res.getRefreshToken().getToken(),
accessToken: res.getAccessToken().getJwtToken(),
accessTokenExpiresAt: res.getAccessToken().getExpiration(),
idToken: res.getIdToken().getJwtToken(),
idTokenExpiresAt: res.getAccessToken().getExpiration(),
};
callback(null, data);
},
onFailure: (err) => {
callback(err);
},
mfaRequired: () => {
const data = {
nextStep: 'MFA_AUTH',
loginSession: cognitoUser.Session,
};
callback(null, data);
},
totpRequired: () => {
const data = {
nextStep: 'SOFTWARE_TOKEN_MFA',
loginSession: cognitoUser.Session,
};
callback(null, data);
},
newPasswordRequired: () => {
const data = {
nextStep: 'NEW_PASSWORD_REQUIRED',
loginSession: cognitoUser.Session,
};
callback(null, data);
},
});
};

export default signin;

Enter fullscreen mode Exit fullscreen mode




The Result in the Postman

Cognito email verification

References

https://github.com/itwebtiger/express-amazon-cognito/tree/congnito-signin
https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-social-idp.html#cognito-user-pools-social-idp-step-1

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more