您可以使用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/