gpt4 book ai didi

node.js - Express Passport (node.js) 错误处理

转载 作者:IT老高 更新时间:2023-10-28 21:50:42 32 4
gpt4 key购买 nike

我通过 this question Error handling principles for Node.js + Express.js applications? 查看了 Node 中的错误处理应该如何工作,但我不确定 Passport 在认证失败时会做什么。我有以下 LocalStrategy:

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
function(email, password, next) {

User.find({email: UemOrUnm}, function(err, user){
if (err) { console.log('Error > some err'); return next(err); }
if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); }

if (password != user.password) {
return next(Incorrect login or password);
}
return next(null, user);
});
}
));

在我看到 'Error > some err' 控制台打印输出后,没有其他任何反应。我认为它应该在带有错误参数的下一条路径上继续,但它似乎没有这样做。怎么回事?

最佳答案

策略实现与 passport.authenticate 一起工作以验证请求并处理成功/失败。

假设你正在使用这条路线(它传递了一个电子邮件地址和一个密码):

app.post('/login', passport.authenticate('local', {
successRedirect: '/loggedin',
failureRedirect: '/login', // see text
failureFlash: true // optional, see text as well
});

这将调用策略中的代码,其中可能发生以下三种情况之一:

  1. 尝试获取用户信息时发生内部错误(例如数据库连接已断开);此错误将被传递:next(err);这将由 Express 处理并生成 HTTP 500 响应;
  2. 提供的凭据无效(没有提供的电子邮件地址的用户,或密码不匹配);在这种情况下,您不会产生错误,但您将 false 作为用户对象传递: next(null, false);这将触发 failureRedirect (如果您没有定义一个,则会生成 HTTP 401 Unauthorized 响应);
  3. 一切都检查过了,你有一个有效的用户对象,所以你把它传递过去:next(null, user);这将触发 successRedirect;

如果身份验证无效(但不是内部错误),您可以在回调中传递额外的消息:

next(null, false, { message : 'invalid e-mail address or password' });

如果您使用过failureFlash 并且安装了the connect-flash middleware , 提供的消息存储在 session 中,可以轻松访问,例如在模板中使用。

编辑:也可以自己完全处理身份验证过程的结果(而不是 Passport 发送重定向或 401):

app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (! user) {
return res.send({ success : false, message : 'authentication failed' });
}
// ***********************************************************************
// "Note that when using a custom callback, it becomes the application's
// responsibility to establish a session (by calling req.login()) and send
// a response."
// Source: http://passportjs.org/docs
// ***********************************************************************
req.login(user, loginErr => {
if (loginErr) {
return next(loginErr);
}
return res.send({ success : true, message : 'authentication succeeded' });
});
})(req, res, next);
});

关于node.js - Express Passport (node.js) 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711127/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com