passport.js是Nodejs中的一個(gè)做登錄驗(yàn)證的中間件,極其靈活和模塊化,并且可與Express、Sails等Web框架無(wú)縫集成。Passport功能單一,即只能做登錄驗(yàn)證,但非常強(qiáng)大,支持本地賬號(hào)驗(yàn)證和第三方賬號(hào)登錄驗(yàn)證(OAuth和OpenID等),支持大多數(shù)Web網(wǎng)站和服務(wù)。
策略是passport中最重要的概念。passport模塊本身不能做認(rèn)證,所有的認(rèn)證方法都以策略模式封裝為插件,需要某種認(rèn)證時(shí)將其添加到package.json即可。
策略模式是一種設(shè)計(jì)模式,它將算法和對(duì)象分離開(kāi)來(lái),通過(guò)加載不同的算法來(lái)實(shí)現(xiàn)不同的行為,適用于相關(guān)類的成員相同但行為不同的場(chǎng)景,比如在passport中,認(rèn)證所需的字段都是用戶名、郵箱、密碼等,但認(rèn)證方法是不同的。關(guān)于策略模式,本文不詳細(xì)展開(kāi),想了解的推薦閱讀Javascript中的策略模式,或者更廣泛意義上的策略模式。
依據(jù)策略模式,passport支持了眾多的驗(yàn)證方案,包括Basic、Digest、OAuth(1.0,和2.0的三種實(shí)現(xiàn))、Bearer等。
Nodejs中做登錄驗(yàn)證的有不少,我聽(tīng)說(shuō)過(guò)的有connect-auth、everyauth、passport,以及Mongoose的插件mongoose-auth。
其中passport和everyauth用的比較多。
everyauth也是基于策略模式,但支持的第三方網(wǎng)站和服務(wù)比passport要少些。另外everyauth還涉及到view/route和database,耦合程度比passport高,而passport則更專注。
值得一提的是,passport的作者聲稱正因?yàn)樗吹?a rel="external nofollow" target="_blank" target="_blank">everyauth不能滿足他的一些需求所以創(chuàng)建了passport,不過(guò)貌似現(xiàn)在everyauth改進(jìn)了其中的部分缺陷;everyauth的作者則聲稱它的建立是基于connect-auth的不足上的。
另外這里有講到選擇適合的Node.js授權(quán)認(rèn)證策略,也講到了兩者的一些不同。
更多建議: