Node.js 使用Passport.js更正身份验证模式
似乎建议使用以下模式:Node.js 使用Passport.js更正身份验证模式,node.js,passport.js,Node.js,Passport.js,似乎建议使用以下模式: app.get("/my/protected/resource", passport.authenticate("local"), function(req, res){ res.json({my:"protected resource"}); }); 作为身份验证后保护资源的标准方式。然而,由于我反复尝试了这个策略,它反复给我401-未经授权。相反,一个中间件解决方案(如以下所示)起到了作用: exports.loggedIn = function(req,
app.get("/my/protected/resource", passport.authenticate("local"), function(req, res){
res.json({my:"protected resource"});
});
作为身份验证后保护资源的标准方式。然而,由于我反复尝试了这个策略,它反复给我401-未经授权。相反,一个中间件解决方案(如以下所示)起到了作用:
exports.loggedIn = function(req, res, next) {
console.log('Checking credentials...');
if(req.isAuthenticated()){
next();
} else {
res.redirect("/");
}
};
然而,这不是找不到,就是没有在文档中突出显示。使用passport.js保护资源的标准和正确方法是哪一种?如果您希望在尝试使用passport.authenticate来访问未经身份验证的受保护资源时重定向到“/”(如您的第二个示例所做的),而不是获得401(默认行为),请使用passport.authenticate
,您可以使用重定向选项,如您链接的文档中页面的第二部分所述:
app.get("/my/protected/resource",
passport.authenticate("local", {failureRedirect: '/' }),
function(req, res){
res.json({my:"protected resource"});
});
如果您正在使用会话,我通常使用这种模式:
app.get('/resource', passport.authenticate('local', {
successRedirect: '/success',
failureRedirect: '/login',
failureFlash: 'Invalid username or password'
}))
如图所示
如果希望在同一函数中使用响应:
app.get('/resource', passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Invalid username or password'
}), function(req, res){
res.json({my:"protected resource"});
})
好的-如果它是一个API(就像我正在构建的),那么很可能不会发生successRedirect,它很可能是一个返回的JSON对象。但是,如果它是一个网站,比如说,而我正试图访问“/dashboard”,那么成功重定向也必须是“/dashboard”吗?还是会产生某种无限循环?如何将它们直接推送到它们请求的页面?在API上,如果第二种方法的长度短到res.json
,我会选择第二种方法。基本上,successRedirect
允许您将代码分离成一个更易于理解的函数,这样身份验证过程就与主应用程序(即,您有一个登录页面和许多受保护页面的网站)分离了。根据会话,一旦您登录(比如在/login/
),就会存储肯定身份验证,这样如果成功重定向到/protectedpage
,它就会记住它。在那些其他页面上,您应该通过阅读req.user
来检查用户是否经过身份验证,因此,对于您评论的最后一部分(req.user检查),您是说我最初发布的中间件“loggedIn”基本上应该修改为检查req.user,然后下一步()?这就是我困惑的地方!如果我想保护资源foo和bar,我是使用passport.authenticate()还是检查req.user!?检查req.user
(如果未登录,将为空)。如果是这种情况,则将其发送到/login
页面。但是,如果是针对API,您可能希望每次都进行passport.authenticate
,因为您可能希望每个API调用都能够在不进行会话处理的情况下进行身份验证(如果您有很多API客户端,则可以节省服务器内存)