为什么passport.authenticate 被调用两次?

las*_*ood 5 passport.js

我正在学习passportjs。我正在查看这里的护照谷歌示例 https://github.com/jaredhanson/passport-google/blob/master/examples/signon/app.js

它包含以下代码行

app.get('/auth/google',
passport.authenticate('google', { failureRedirect: '/login' }),
function(req, res) {
    res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)

随后,这些行:

app.get('/auth/google/return',
passport.authenticate('google', { failureRedirect: '/login' }),
function(req, res) {
    res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解为什么需要重复调​​用passport.authenticate吗?

dav*_*djb 3

这两个调用实际上提供不同的功能,具体取决于收到的请求类型以及流程所处的身份验证阶段。

第一个调用passport.authenticate是启动 OpenID 身份验证(这是passport-google在后台使用的),第二个调用(针对returnURL)由 OpenID 提供者用来响应先前的身份验证请求。护照策略从第二个请求中读取相关断言并进行相应的处理——最终导致/login如果断言失败则重定向,或者/如果断言成功则重定向。

https://github.com/jaredhanson/passport-openid/blob/master/lib/passport-openid/strategy.js#L164的源代码包含一些写得很好的注释,解释了发生的情况。

最后,其他 Passport 策略的行为可能有所不同,因此并非每个具有回调的策略都必须需要对 进行看似“重复”的相同调用passport.authenticate(...)