#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 вопроса:
- Почему я не получаю авторизованный ответ, когда пытаюсь войти во второй раз с правильными / неправильными учетными данными?
- Как получить сообщения неизвестного пользователя или пароля из LocalStrategy для отправки клиенту (где passportjs сохраняет их)?
Ответ №1:
Хорошо, понял это:
- Из-за моей неправильной функции passport.deserializeUser() (скопировал и забыл изменить)
- Вы можете получить эти сообщения в пользовательской функции обратного вызова, представленной в методе 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);
});