您可以在不重定向的情况下使用 Passport 进行身份验证吗?
Posted
技术标签:
【中文标题】您可以在不重定向的情况下使用 Passport 进行身份验证吗?【英文标题】:Can you authenticate with Passport without redirecting? 【发布时间】:2015-01-07 16:11:28 【问题描述】:我有以下工作代码通过本地护照策略进行身份验证:
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 对象中,您可以找到所有需要的错误,这些错误在身份验证时出现。
【讨论】:
完美!您是否碰巧知道本地注册是否有req.logIn
的等价物?除此之外,非常感谢!
只需要编写其他策略,调用函数注册新用户【参考方案2】:
你在用猫鼬吗? 尝试将此添加到您的 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);
);
在这里,您可以使用 return res.status(404).json("Not Found)
之类的东西来代替 res.redirect
有关更多信息,请参阅文档:http://passportjs.org/guide/authenticate/
【讨论】:
就身份验证而言,一切正常,只是回调(在您的情况下为 auth.login)仅在登录成功时才被触发。我也想在失败时给出消息,这是你在策略中无法做到的。 感谢@Clto,你无意中回答了我的 4 个随机问题 你也有用户模型吗?以上是关于您可以在不重定向的情况下使用 Passport 进行身份验证吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不重定向到外部登录页面的情况下进行 SPA 身份验证
如何在不重定向原始 URL 的情况下获取短 URL 服务的信息或实际信息