Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Passport.js更正身份验证模式_Node.js_Passport.js - Fatal编程技术网

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客户端,则可以节省服务器内存)