根据the documentation,如果我处理这样的身份验证请求,我将能够捕获成功的尝试。
app.post('/login',
passport.authenticate('local'),
function(req, res) {
// If this function gets called, authentication was successful.
// `req.user` contains the authenticated user.
res.redirect('/users/' + req.user.username);
});
但是,就像文档说的那样:
默认情况下,如果身份验证失败,Passport将以401 Unauthorized状态响应,并且不会调用任何其他路由处理程序。如果身份验证成功,将调用下一个处理程序并执行req。 user属性将设置为经过身份验证的用户。
如何处理未经授权的登录尝试?
我知道我可以使用自定义中间件处理它但是有更好的方法吗?
答案 0 :(得分:14)
您应该查看passport docs中的自定义回调部分,其中介绍了如何覆盖处理身份验证请求的内置行为。您可以编写一个自定义回调,它将服务于您从策略中调用的done
函数的目的。
app.get('/login', function(req, res, next) {
/* look at the 2nd parameter to the below call */
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);
});
查看passport.authenticate
调用的第二个参数,它将作为您从本地策略调用的done函数。
请参阅以下代码中调用的done函数,该函数是您为护照定义的本地策略。您可以根据API调用或数据库操作的响应,使用策略中设置的err
,user
,info
等各种可用参数调用done函数。这些参数将由passport.authenticate
调用中的上述函数定义处理。
passport.use(new LocalStrategy(
function(username, password, done) {
/* see done being invoked with different paramters
according to different situations */
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
答案 1 :(得分:0)
在我的情况下,我不希望出现401错误(这是“默认行为”),
而且我只是想要一个简单的重定向,如果该用户未被授权。简单的 EditText editText=(EditText)findViewById(R.id.user_message);
对我有用,如PassportJS documentation中所述(在“概述”和“重定向”标头中)
尽管身份验证涉及复杂性,但代码却没有 必须很复杂。
{ failureRedirect: '/login' }
在这种情况下,重定向选项将覆盖默认行为。在 身份验证成功后,用户将被重定向到家庭 页。如果身份验证失败,用户将被重定向回 登录页面进行另一次尝试。
已接受的答案为您提供了更大的灵活性。但这答案要简单一些。
我非常确定“失败”包括没有用户的情况:app.post('/login', passport.authenticate('local', { successRedirect:'/',
failureRedirect: '/login' }));
,但我不不确定失败是否包括错误情况:{ {1}}(如accepted answer.