您可以使用Passport进行身份validation而不redirect吗?

我有以下工作代码通过护照本地策略进行身份validation:

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}); }); 

但是,理想情况下,我想处理一条快速路线中的错误和成功消息,而不是redirect到两条额外的路线。

这可能吗? 我尝试使用“自定义callback”,但似乎错误序列化用户出于某种原因。

您可以使用自定义callback,例如:

 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对象中,您可以find所有需要的错误,这些错误在身份validation时出现。

你在使用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' }); 

我在这里做了很多关于结构和包装的假设。 但是这应该工作

编辑

对于自定义callback:

 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/