Повторное действие входа в Passport.js с местной стратегией

#javascript #express #passport.js

#javascript #экспресс #passport.js

Вопрос:

не могу понять следующее: я использую express с локальной стратегией passportjs для входа в систему с сеансом. Когда я впервые захожу в свое приложение, оно работает нормально. Но когда я снова вхожу в систему, когда я уже вошел в систему, я не получаю никакого ответа (независимо от того, верны мои учетные данные или нет). Мой passport.js:

 const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const db = require('../models');

module.exports = function (app, db) {
  app.use(passport.initialize());
  app.use(passport.session());

  passport.serializeUser(function (user, done) {
    done(null, user.tn);
  });

  passport.deserializeUser(function (tn, done) {
    db.User.findByPk(tn, function (error, user) {
      done(error, user);
    });
  });

  const localStrategy = new LocalStrategy(async (tn, password, done) => {
    try {
      const user = await db.User.findByPk(tn);
      if (user) {
        const passwordIsValid = await user.verifyPassword(password);
        if (passwordIsValid) {
          return done(null, user);
        } else {
          return done(null, false, { message: 'Unknown user or password' });
        }
      } else {
        return done(null, false, { message: 'Unknown user or password' });
      }
    } catch (error) {
      return done(error);
    }
  });
  passport.use('local', localStrategy);
  return passport;
};
 

Мой маршрут входа в систему:

 const express = require('express');
const passport = require('passport');

module.exports = (app) => {
  app.post('/login', passport.authenticate('local'), (req, res) => {
    console.log('Authorized');
    res.send('Authorized');
  });
};
 

Итак, у меня есть 2 вопроса:

  1. Почему я не получаю авторизованный ответ, когда пытаюсь войти во второй раз с правильными / неправильными учетными данными?
  2. Как получить сообщения неизвестного пользователя или пароля из LocalStrategy для отправки клиенту (где passportjs сохраняет их)?

Ответ №1:

Хорошо, понял это:

  1. Из-за моей неправильной функции passport.deserializeUser() (скопировал и забыл изменить)
  2. Вы можете получить эти сообщения в пользовательской функции обратного вызова, представленной в методе passport.authenticate(стратегия, параметры, обратный вызов) (информационный объект):
     app.post('/login', (req, res, next) => {
        passport.authenticate('local', (error, user, info) => {
            if (error) {
                return res.status(503).send({ message: error.message });
            }
            if (info) {
                console.log('message: '   info.message);
            }
            req.login(user, (err) => {
                return res.status(200).send('You were authenticated amp; logged in');
            });
        })(req, res, next);
    });