对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
如果不是您想知道的,请澄清您的问题。
更新:
正如已经提到的,callback
是passport.authenticate()
中的可选参数。如果你传递它——这个函数被 verified(default) 包裹,它成为你策略中的 3d 参数。当您在那里调用此包装函数时,它会验证您发送的参数并确定响应类型:success
、fail
或 error
— 所有这些方法都创建 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 获取用户输入
nodejs - passport.use 回调返回 dataValues 和 _previousDataValues 而不是普通对象