Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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
Javascript 理解Passportjs自定义回调_Javascript_Passport.js - Fatal编程技术网

Javascript 理解Passportjs自定义回调

Javascript 理解Passportjs自定义回调,javascript,passport.js,Javascript,Passport.js,我正在试验Passportjs,自定义回调的代码是: 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

我正在试验Passportjs,自定义回调的代码是:

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);
});
我对所有这些代码都很满意,除了倒数第二行
(req,res,next)-有人能解释一下为什么在末尾添加这些参数吗。这可能更像是一个JS问题,而不是Passport问题,但我们非常感谢您的帮助。

javascript的答案是,它返回一个函数,然后使用第二组参数再次调用该函数

该功能是“链中每个策略的故障累加器”


您可以在不使用匿名函数或自定义回调的情况下重写它。只需使用passport的
passport。使用(new LocalStrategy())
函数创建新策略

您只需将
logIn
函数移到此文件中,而不是将方法移到
req
。然后,您可以简单地调用passport.authenticate
,如下所示:

app.get('/login', passport.authenticate('local', { successRedirect: '/',
                                                   failureRedirect: '/login' }));
因此,您不必在回调中使用res.redirect,只需使用passport内置的
successRedirect
failureRedirect
属性即可。您也可以在上看到他们的文档。

Connect/Express middleware函数具有签名:

function(req, res, next)
passport.authenticate()
可用作中间件,例如:

app.post('/login', passport.authenticate('local'), nextMiddleware);

这意味着
authenticate()
返回一个中间件函数对象,您可以使用
(req,res,next)
参数调用该对象以继续应用程序的请求-响应周期。

这也是一个通行证问题。显然,
passport.authenticate(…)
确实返回了一个函数。看起来它被设计成写为
app.get('/login',passport.authenticate('local',函数(err,user,info){…})在您的示例中,似乎缺少(req、res、next)。如果没有res.redirect(),如何调用它们?我真的很喜欢你的回答,因为我有一个常用的回调函数。@Chris更新了答案以便更好地工作。您可能不应该使用回调,而是应该使用实际的身份验证函数来完成所有工作。这对你有用吗?谢谢你的调整,但这正是我想要摆脱的我正在使用它进行API身份验证,我不想重定向。我正在使用它用正确的响应代码自定义我的API响应,并用我的响应传递消息。@Chris这是用来为经过身份验证和未经身份验证的路由发送不同数据的吗?有一种passport身份验证策略:
app.post('/login', passport.authenticate('local'), nextMiddleware);