Фон
У меня есть приложение MEAN с возможностями CRUD, полностью протестированными с почтальоном. Я уже давно пытаюсь найти логин без везения. Я прочитал и попробовал следующее
- документы о паспорте
- toon io блог о входе в систему
- Экспресс-сессия
- Скотч io, node auth упрощен
- Плюс бухту других легких материалов для чтения (много вопросов SO)
Но я только смог зарегистрировать и зарегистрировать пользователя, а не настаивать на входе в сеанс.
Мое приложение
Здесь - ссылка на полное github repo (если вы ищете последние изменения, проверьте развитие ветки)
Мое понимание Auth/Login
Вот мое понимание входа пользователя с примерами кода из моего проекта и скриншотом результатов postman, а также консольных журналов.
Настройка паспорта
У меня есть следующий файл auth.js, он configs паспорт
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
module.exports = function(app, user){
app.use(passport.initialize());
app.use(passport.session());
// passport config
passport.use(new LocalStrategy(user.authenticate()));
passport.serializeUser(function(user, done) {
console.log('serializing user: ');
console.log(user);
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
user.findById(id, function(err, user) {
console.log('no im not serial');
done(err, user);
});
});
};
Это вызывается в файле сервера, например
//code before
var user = require('./models/user.js');
var auth = require('./modules/auth.js')(app, user);
// code after
Маршрутизация для входа
В моих маршрутах у меня есть логин, как показано ниже.
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(401).json({
err: info
});
}
req.logIn(user, function(err) {
if (err) {
return res.status(500).json({
err: 'Could not log in user'
});
}
res.status(200).json({
status: 'Login successful!'
});
});
})(req, res, next);
});
Этот маршрут работает, как проверено с почтальоном. Я ввожу детали "joe" и "pass" и получаю следующий ответ.
Когда этот маршрут ударил, мы также видим на консоли, что пользователь сериализуется.
Итак, что дальше?
Вот где я заблудился. У меня есть несколько вопросов.
- Является ли пользователь сейчас в сеансе на моем сервере?
- Должен ли я отправить
req.session.passport.user
обратно клиенту? - Нужен ли мне идентификатор сеанса для всех будущих запросов?
Тестирование сеанса
У меня есть вторая настройка маршрута для тестирования сеанса следующим образом
router.get('/checkauth', passport.authenticate('local'), function(req, res){
res.status(200).json({
status: 'Login successful!'
});
});
Часть passport.authenticate('local')
(я думал) есть, чтобы проверить, существует ли пользовательский сеанс до предоставления доступа к маршруту, но я никогда не получаю ответ 200, когда я его запускаю, даже после входа в систему.
Ожидает ли этот маршрут req.session.passport.user
в голове или как аргумент данных в HTTP-запросе, для которого требуется auth?
Если я пропустил что-либо или понял что-то неправильно, скажите, пожалуйста, любой ввод приветствуется. Спасибо всем.