passport.js是Nodejs中的一個做登錄驗證的中間件,極其靈活和模塊化,并且可與Express、Sails等Web框架無縫集成。Passport功能單一,即只能做登錄驗證,但非常強大,支持本地賬號驗證和第三方賬號登錄驗證(OAuth和OpenID等),支持大多數Web網站和服務。
* 官網:?[http://passportjs.org/](http://passportjs.org/)
* Github:?[http://github.com/jaredhanson/passport](http://github.com/jaredhanson/passport)
* NPM:?[https://www.npmjs.org/package/passport](https://www.npmjs.org/package/passport)
## 策略(Strategy)
策略是passport中最重要的概念。passport模塊本身不能做認證,所有的認證方法都以策略模式封裝為插件,需要某種認證時將其添加到package.json即可。
策略模式是一種設計模式,它將算法和對象分離開來,通過加載不同的算法來實現不同的行為,適用于相關類的成員相同但行為不同的場景,比如在passport中,認證所需的字段都是用戶名、郵箱、密碼等,但認證方法是不同的。關于策略模式,本文不詳細展開,想了解的推薦閱讀[Javascript中的策略模式](http://www.oschina.net/translate/strategy-design-pattern-in-javascript),或者[更廣泛意義上的策略模式](http://blog.csdn.net/hguisu/article/details/7558249)。
依據策略模式,passport支持了眾多的驗證方案,包括Basic、Digest、OAuth(1.0,和2.0的三種實現)、Bearer等。
## passport和everyauth
Nodejs中做登錄驗證的有不少,我聽說過的有connect-auth、everyauth、passport,以及Mongoose的插件mongoose-auth。
其中passport和everyauth用的比較多。
everyauth也是基于策略模式,但支持的第三方網站和服務比passport要少些。另外everyauth還涉及到view/route和database,耦合程度比passport高,而passport則更專注。
值得一提的是,passport的作者聲稱正因為他看到[everyauth不能滿足他的一些需求](http://stackoverflow.com/questions/11974947/everyauth-vs-passport-js)所以創建了passport,不過貌似現在everyauth改進了其中的部分缺陷;everyauth的作者則聲稱它的建立是[基于connect-auth的不足](http://stackoverflow.com/questions/5765063/node-js-connect-auth-vs-everyauth)上的。
另外這里有講到[選擇適合的Node.js授權認證策略](http://blog.csdn.net/chszs/article/details/24928985),也講到了兩者的一些不同。