Получение информации о нескольких пользователях в сеансе при использовании паспортной аутентификации - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь реализовать аутентификацию на основе сеанса с использованием passport, для подписывающего пользователя, которому я даю, я могу получить информацию о пользователе из сеанса по последующим запросам.

Проблема, с которой я столкнулся, заключается в том, что, когда несколько пользователей вошли в систему, сеанс всегда возвращает информацию о последнем вошедшем пользователе, независимо от того, какой пользователь делает запрос.

Как отличить разных пользователей отсозданы разные сеансы?

конфигурация паспорта

/**
 * @author Wokoro Douye Samuel
 */

import passport from 'passport';
import { Strategy as LocalStrategy } from 'passport-local';
import userRepository from '../components/user/repository';
import { userInfo, verifyPassword } from '../utils';

/**
 * @description Passport serialization configuration.
 */
passport.serializeUser((uuid, done) => done(null, uuid));


/**
* @description Passport user deserialization configuration.
*/
passport.deserializeUser(async (user_id, done) => {
  const user = await userRepository.getOne({ uuid: user_id });
  const userDetails = userInfo(user);
  done(null, userDetails);
});

/**
 * @description Passport strategy configuration.
 */
passport.use(new LocalStrategy(
  {
    usernameField: 'email',
    passwordField: 'password',
  },
  (async (email, password, done) => {
    let passwordVerified = false;
    try {
      const result = await userRepository.getOne({ email });
      if (result) {
        const { dataValues: { password: hashedPassword } } = result;
        passwordVerified = verifyPassword(password, hashedPassword);
      }  
      if (!passwordVerified) { 
        return done(null, false, { message: 'Email or password incorrect' });
      }
      const { uuid } = userInfo(result.dataValues);
      return done(null, uuid);
    } catch (err) {
      return done(err);
    }
  }),
));

export default passport;

пользовательский контроллер

/**
 * @author Wokoro Douye Samuel
 */

import userRepository from './repository';
import { userInfo, hashPassword } from '../../utils';

export default {
  /**
   * @description Controller method to create new user.
   * 
   * @param {object} req - HTTP request object.
   * 
   * @param {object} res - HTTP response object.
   * 
   * @param {function} next - Function to call next function.
   * 
   * @returns {object} Returns created user and status code 
   */
  async create({ body }, res, next) {
    body.password = hashPassword(body.password);
    try {
      const result = await userRepository.create(body);
      res.status(200).send({ 
        status: 'success', 
        data: userInfo(result), 
      });
    } catch (err) {
      next(err);
    }
  },

  /**
   * @description Controller method to login user.
   * 
   * @param {object} req - HTTP request object.
   * 
   * @param {object} res - HTTP response object.
   * 
   * @param {function} next - Function to call next function.
   * 
   * @returns {object} Returns login success message and status code.
   * 
   */
  async login(req, res, next) {
    try {
      return res.status(200).send({ 
        status: 'success', 
        data: 'login succeful', 
      });
    } catch (error) {
      next(error);
    }
  },
};

Пользовательские маршруты

/**
 * @auther Wokoro Douye Samuel
 */

import { inputValidation, authenticateUser } from './validation';
import userControllers from './controller';

/**
 * @description Variable to hold user routes.
 */
export default [
  {
    path: '/signup',
    handlers: [...inputValidation, userControllers.create],
    method: 'post',
  },
  {
    path: '/login',
    handlers: [authenticateUser, userControllers.login],
    method: 'post',
  },
];

Ссылку на мой репозиторий можно найти здесь

...