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),也讲到了两者的一些不同。