对passport.use(strategy) done 功能及其与passport.authenticate 的关系感到困惑

Posted

技术标签:

【中文标题】对passport.use(strategy) done 功能及其与passport.authenticate 的关系感到困惑【英文标题】:Confused about passport.use(strategy) done function and it's relation with passport.authenticate 【发布时间】:2021-08-17 08:22:06 【问题描述】:

我有几个关于 passport.js 工作原理的问题。在它的文档上有一个例子:

    passport.use(new LocalStrategy(
  function(username, password, done) 
    User.findOne( username: username , function (err, user) 
      if (err)  return done(err); 
      if (!user) 
        return done(null, false,  message: 'Incorrect username.' );
      
      if (!user.validPassword(password)) 
        return done(null, false,  message: 'Incorrect password.' );
      
      return done(null, user);
    );
  
));

从this我读到的文章:

调用 done 将使流程跳转回 passport.authenticate。 它传递了错误、用户和附加信息对象(如果已定义)。

所以问题是(并希望它们有意义):

    done 函数在哪里定义? 如何将它作为参数传递给函数(用户名, 密码,完成)? passport.use(new LocalStrategy()) 如何连接到 护照。认证?报价单说一个呼叫另一个,但我 看不到发生了什么

谢谢!

【问题讨论】:

【参考方案1】:

当您调用passport.authenticate() 时,您将done() 函数作为参数传递。当您调用它时,您的策略也会被调用并传递您定义为 3d 参数的函数。

视觉流

function done(err, user, info) => 
  if (err || !user) 
    return new Error(info.msg);
  

  // log-in user


// pass done
passport.authenticate("local", done); 
              │                 └┬──→ will be called within LocalStrategy
              │                  │    e.g. if (!user) done(err, user, info);
              ↓                  │
  calls your strategy func       │
                 └───┐           └───────────────┐
                     ↓                           ↓           
new LocalStrategy(function (username, password, done) 
  User.findOne( username, (err, user) =>      │
    if (!user)                                  │
      return done(err, user,  mgs: "err" );  ←─┤
                                                │
  );                                            ↓
);                                   here done func is called

如果不是您想知道的,请澄清您的问题。

更新:

正如已经提到的,callbackpassport.authenticate() 中的可选参数。如果你传递它——这个函数被 verified(default) 包裹,它成为你策略中的 3d 参数。当您在那里调用此包装函数时,它会验证您发送的参数并确定响应类型:successfailerror — 所有这些方法都创建 here 并调用 your custom done() 函数(如果存在)。如果未提供 passport 则自动处理授权。

【讨论】:

感谢您的回复!对此,我真的非常感激。为了清楚起见,在这种情况下,您提供了一个自定义完成功能。护照文档中有一个例子,这个:passport.authenticate('local', successRedirect: '/',failureRedirect: '/login' )); 那么问题是,在这种情况下,在哪里定义完成?或者更广泛地说,源代码中定义的默认完成函数在哪里? 猜猜这里的某个地方github.com/jaredhanson/passport/blob/… 好的。是的,我必须说一句:done() 函数被verified() 函数包装(正如你所说,这是默认函数)-github.com/jaredhanson/passport-local/blob/…-这是您策略中的done() 函数:(username, password, done) => ... 。因此,如果您不指定自定义回调,则用户的授权,建立会话将成为自动。稍后我会尝试描述他们关系的整个过程。 我现在更新了我的帖子。我希望我正确理解了您的需求... 再次感谢您的回复和全面更新莱昂纳多!

以上是关于对passport.use(strategy) done 功能及其与passport.authenticate 的关系感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Passport js,使用 Handlebars 获取用户输入

如何配置OAuth服务器以发送配置文件信息?

nodejs - passport.use 回调返回 dataValues 和 _previousDataValues 而不是普通对象

Google oauth20 匿名回调函数未在 passport.use 块中执行

在 Passport 策略回调中获取请求对象

无法使用 passport-jwt 访问受保护的路线