2014-10-08 108 views
3

我正在學習passportjs。我在這裏 https://github.com/jaredhanson/passport-google/blob/master/examples/signon/app.js爲什麼passport.authenticate調用了兩次?

看護照,谷歌例如它包含以下幾行代碼

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

而隨後,這些線路:

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

有人可以幫助我瞭解爲什麼需要重複調​​用passport.authenticate?

回答

0

這兩個調用實際上根據接收的請求類型以及流在哪個驗證階段提供不同的功能。

第一呼叫passport.authenticate是發起OpenID身份驗證(這是passport-google引擎蓋下使用)和所述第二呼叫(對return URL)是用來通過OpenID提供到現有的認證請求進行響應。 Passport策略從第二個請求中讀取相關的斷言並相應地處理它 - 如果斷言失敗,最終導致重定向到/login,或者如果斷言成功,則導致重定向到/

https://github.com/jaredhanson/passport-openid/blob/master/lib/passport-openid/strategy.js#L164的源代碼包含一些精心編寫的註釋,解釋發生了什麼。

作爲最後一項,其他Passport策略可能會有不同的表現,因此不是每個有回調的策略都需要對passport.authenticate(...)進行相同的表面上「重複」調用。