Source: middleware/authenticate.middleware.js

import passport from 'passport';

/**
 * Authenticate local login request
 *
 * @module middleware/authenticate
 * @param {Object} request      HTTP Request object
 * @param {Object} response     HTTP Response object
 * @param {Object} next         Next middleware callback
 */
const authenticate = async (request, response, next) => {
  passport.authenticate('local', async (error, user, info) => {
    try {
      if (error || !user) {
        const error = new Error(info.message || 'AUTHENTICATION ERROR: Unauthorized access.');
        error.statusCode = 401;
        throw error;
      }

      // Custom callback so we can add user to the request object and customise the error message
      request.login(user, { session: false }, async (error) => {
        if (error) {
          return next(error);
        }

        return next();
      });
    } catch (error) {
      let message;
      if (error.message.split(':')[0] === 'SERVICE ERROR') {
        message = 'AUTHENTICATION ERROR: Unauthorized access.';
      }
      return next(error);
    }
  })(request, response, next);
};

export { authenticate };
export default authenticate;