作为Passport 的开发者,请与我的两分钱相提并论。
在开发 Passport 之前,我评估了everyauth 并确定它不符合我的要求。所以,我着手实施一个不同的解决方案。我想解决的主要问题是:
惯用的 Node.js
everyauth 广泛使用 Promise,而不是 Node 使用回调和闭包的方法。 Promise 是异步编程的另一种方法。虽然在某些高级情况下很有用,但我不喜欢身份验证库将这种选择强加于我的应用程序。
此外,我发现正确使用回调和闭包会产生简洁、架构良好(几乎是函数式风格)的代码。 Node 本身的大部分力量都来自这一事实,Passport 也效仿。
模块化
Passport 采用一种策略设计模式来定义核心模块和各种身份验证机制之间的关注点的清晰分离。这有很多好处,包括更小的整体代码大小以及定义良好且可测试的接口。
对于基本说明,比较运行$ npm install passport 和$ npm install everyauth 之间的区别。 Passport 允许您仅使用您实际需要的依赖项来制作您的应用程序。
这种模块化架构已证明自己具有适应性,有助于实现对各种身份验证机制(包括 OpenID、OAuth、BrowserID、SAML 等)的支持的社区。p>
灵活
Passport 只是中间件,使用 Connect 和 Express 建立的 fn(req, res, next) 约定。
这意味着没有意外,因为您可以定义您想要路由的位置以及何时要使用身份验证。也不依赖于特定的框架。人们成功地将 Passport 与其他框架一起使用,例如 Flatiron
相比之下,everyauth 中的任何模块都可以将路由插入到您的应用程序中。这可能会使调试变得困难,因为如何调度路由并导致与特定框架的紧密耦合并不明显。
Passport 也以完全传统的方式出错,仅次于 Express 定义的 error-handling 中间件。
相比之下,everyauth 有自己的约定,不能很好地适应问题空间,导致长期存在的开放问题,例如 #36
API 认证
任何身份验证库的最高成就是它能够像处理基于 Web 的登录一样优雅地处理 API 身份验证。
我不会详细说明这一点。但是,我鼓励人们研究 Passport 的兄弟项目,OAuthorize 和 OAuth2orize。使用这些项目,您可以为基于 HTML/会话的 Web 应用程序和 API 客户端实施“全栈”身份验证。
可靠
最后,身份验证是应用程序的关键组件,您希望完全放心地依赖它。 everyauth 有一个很长的issues 列表,其中许多会随着时间的推移保持开放并重新出现。在我看来,这是由于单元测试覆盖率低,这本身表明everyauth 中的内部接口没有适当定义。
相比之下,Passport 的接口及其策略定义良好,并且被单元测试广泛覆盖。针对 Passport 提出的Issues 大多是次要功能请求,而不是与身份验证相关的错误。
尽管是一个年轻的项目,但这种质量水平表明更成熟的解决方案更容易维护和信任。