Можете ли вы пройти аутентификацию с помощью Passport без перенаправления?
У меня есть следующий рабочий код для аутентификации через локальную стратегию паспорта:
app.post('/api/login', passport.authenticate('local-login', {
successRedirect : '/api/login/success',
failureRedirect : '/api/login/error',
failureFlash : true
}));
app.get('/api/login/error', function(req, res) {
res.send(401, {error: req.flash('loginMessage')});
});
app.get('/api/login/success', function(req, res) {
res.send(200, {user: req.user});
});
Однако в идеале я хочу обрабатывать сообщения об ошибках и успешных сообщениях с одного экспресс-маршрута, а не перенаправлять на два дополнительных маршрута.
Возможно ли это? Я попытался использовать "пользовательский обратный вызов", но по какой-то причине, по-видимому, возникла ошибка при сериализации пользователей.
Ответы
Ответ 1
Вы можете использовать пользовательский обратный вызов, например:
passport.authenticate('local', function (err, account) {
req.logIn(account, function() {
res.status(err ? 500 : 200).send(err ? err : account);
});
})(this.req, this.res, this.next);
В объекте err вы можете найти все необходимые ошибки, которые появились при аутентификации.
Ответ 2
Вы используете Mongoose?
Попробуйте добавить это на свой сервер server.js/index.js
var User = mongoose.model('User');
passport.use(new LocalStrategy(User.authenticate()));
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
Это вашим маршрутам index.js
var auth = require('./auth');
app.post('/api/auth/login', passport.authenticate('local'),auth.login);
auth.js:
var UserModel = require('../models/user');
var User = new UserModel();
exports.login = function(req, res) {
var user = req.user;
req.login(user, function(err) {
//if error: do something
return res.status(200).json(user)
});
};
Добавьте это в модель index.js
var passportLocalMongoose = require('passport-local-mongoose');
userSchema.plugin(passportLocalMongoose, {
usernameField: 'email',
usernameLowerCase: 'true'
});
Я делаю много предположений о структуре и пакетах здесь. но это должно работать
ИЗМЕНИТЬ
Для пользовательских обратных вызовов:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
Здесь вы вместо res.redirect
можете использовать что-то вроде return res.status(404).json("Not Found)
Дополнительную информацию см. в документах: http://passportjs.org/guide/authenticate/