Node.js:Connect-Auth VS. EveryAuth

任何人都可以给一个很好的比较: https : //github.com/ciaranj/connect-auth和https://github.com/bnoguchi/everyauth

这似乎是快递 / 连接的唯一select

这两个库在function集上都非常接近,特别是在支持的提供者方面。 connect-auth提供了开箱即用的支持来创build自己的oAuth提供程序,因此,如果您需要这种types的帮助,可以帮助您解决问题。

我注意到两者之间的主要问题是,我发现connect-auth更清晰,创build和接受中间件; 你只需要在everyauth中查看中间件所需的预configuration数量, everyauth可以看到它将变得混乱。

另一个不清楚的是, everyauth是否everyauth支持多个提供商。 与connect-auth ,似乎可能/更直接,虽然我还没有尝试这个自己。

我是everyauth的作者。

我写了everyauth因为我发现使用connect-auth缺乏以下方面:

  1. 简单而强大的configuration

    为了获得特别的,一个缺乏可configuration性的领域是dynamic地设置Facebook的“范围”安全设置。

  2. 良好的debugging支持

    我发现connect-auth在调查auth进程失败的部分方面并不那么简单。 这主要是由于connect-auth设置嵌套callback的方式。

通过everyauth,我试图创build一个系统来解决我在connect-auth中遇到的问题。

  • 在configuration上 – everyauth auth模块被定义为一系列的步骤和可configuration的参数。 因此,对于要更改的参数(例如,主机名,callbackURL等)或步骤(例如,getAccessToken,addToSession),您具有类似于手术的精确性。 通过connect-auth ,如果你想改变一个东西,除了每个auth策略提供的可configuration参数中build立的less数内容,你必须重新编写整个this.authenticate函数来定义所有策略的逻辑。 换句话说,它的可configuration性比everyauth 。 在其他情况下,您不能像现在那样使用connect-auth ,例如,实现dynamic的Facebook“范围”可configuration性 – 即在用户需要更多权限的情况下,逐步询问用户更多的Facebook权限。

    除了可configuration的步骤和参数之外,您还可以利用everyauth的身份validation模块inheritance。 所有模块都从EveryModule auth模块原型inheritance。 所有基于OAuth2的模块都inheritance自oauth2模块。 假设您希望所有oauth2模块的行为不同。 所有你需要做的就是修改oauth2 auth模块,所有基于oauth2的模块都会inheritance这个新的行为。

  • 在debugging时 ,在我看来, everyauth具有更好的debugging可见性,因为它明确地将每个模块分割成它所组成的步骤。 通过设置

     everyauth.debug = true; 

    您将获得authentication过程中已完成哪些步骤以及哪些步骤失败的输出。 您还可以精确地控制每个授权策略中的每个步骤在超时之前的持续时间。

  • 在可扩展性方面 – 我devise了everyauth来最大化代码重用。 如前所述,所有模块都从EveryModule auth模块原型inheritance。 这意味着您可以实现非常模块化的系统,同时在祖先模块的特定步骤中进行细粒度控制。 要看看使用自己的auth模块来扩展everyauth是多么容易,只要看一下everyauth源代码中的任何特定的auth模块。

  • 在可读性方面 – 我发现everyauth来源都比较容易阅读。 通过connect-auth ,我发现自己在几个文件中跳转,以了解在什么情况下(即,在每个步骤中,以everyauth说法),由策略configuration的每个嵌套callback正在运行。 通过everyauth ,你确切知道哪个逻辑与哪个上下文(aka step)相关联。 例如,以下代码描述了oauth2提供者redirect到您的服务时发生的情况:

     .get('callbackPath', 'the callback path that the 3rd party OAuth provider redirects to after an OAuth authorization result - eg, "/auth/facebook/callback"') .step('getCode') .description('retrieves a verifier code from the url query') .accepts('req res') .promises('code') .canBreakTo('authCallbackErrorSteps') .step('getAccessToken') .accepts('code') .promises('accessToken extra') .step('fetchOAuthUser') .accepts('accessToken') .promises('oauthUser') .step('getSession') .accepts('req') .promises('session') .step('findOrCreateUser') .accepts('session accessToken extra oauthUser') .promises('user') .step('compile') .accepts('accessToken extra oauthUser user') .promises('auth') .step('addToSession') .accepts('session auth') .promises(null) .step('sendResponse') .accepts('res') .promises(null) 

    不需要解释它是如何工作的,它很直截了当地看到oauth2策略的作用。 想知道getCode做什么? 源再次是非常简单的:

     .getCode( function (req, res) { var parsedUrl = url.parse(req.url, true); if (this._authCallbackDidErr(req)) { return this.breakTo('authCallbackErrorSteps', req, res); } return parsedUrl.query && parsedUrl.query.code; }) 

    比较这一切connect-auth的Facebook的代码,这对我来说,至less花了更多的时间比我认为应该有什么时候得到执行。 这主要是因为代码跨文件传播的方式,并且由于使用单个authenticate方法和嵌套callback来定义身份validation逻辑( everyauth使用promise来将逻辑分解为易于消化的步骤):

     that.authenticate= function(request, response, callback) { //todo: makw the call timeout .... var parsedUrl= url.parse(request.url, true); var self= this; if( parsedUrl.query && parsedUrl.query.code ) { my._oAuth.getOAuthAccessToken(parsedUrl.query && parsedUrl.query.code , {redirect_uri: my._redirectUri}, function( error, access_token, refresh_token ){ if( error ) callback(error) else { request.session["access_token"]= access_token; if( refresh_token ) request.session["refresh_token"]= refresh_token; my._oAuth.getProtectedResource("https://graph.facebook.com/me", request.session["access_token"], function (error, data, response) { if( error ) { self.fail(callback); }else { self.success(JSON.parse(data), callback) } }) } }); } else { request.session['facebook_redirect_url']= request.url; var redirectUrl= my._oAuth.getAuthorizeUrl({redirect_uri : my._redirectUri, scope: my.scope }) self.redirect(response, redirectUrl, callback); } } 

其他一些差异

  • everyauth支持传统的基于密码的authentication。 在撰写本文时, connect-auth不会。
  • connect-auth中的foursquare和google支持基于较早的OAuth1.a规范。 everyauth的foursquare和google模块是基于他们对新的OAuth2规范的实现。
  • everyauth支持everyauth
  • everyauth的文档比connect-auth更全面。

最后,对Nathan的答案发表评论,这个答案不确定是否everyauth支持多个提供者的everyautheveryauth确实支持多个并发的提供者。 在everyauth的github页面上的README提供了关于如何使用everyauth来实现这个目的的指示。

总之,我认为图书馆的select取决于开发者。 我和其他人从他们的观点中发现更强大的东西。 正如Nathan的回答所示,还有一些人认为connect-auth更适合他们的偏好。 不pipe你select什么,我希望这篇关于为什么我写作everyauth文章everyauth帮助你做出决定。

我想提一下,现在有一个叫做PassportJS的新玩家,它具有与everyauth相同的好处,但是npm模块提供了身份validation提供程序 – 所以select而不是包含所有内容。

我花了一个上午和everyauth和mongoose玩,以发现例子被打破,他们是死的项目。 这里是提交历史:

https:// github.com/jaredhanson/passport/commits/master – 6月5日(6月18日)https:// github.com/ciaranj/connect-auth/commits/master – 4月18日(2个月前)https: // github.com/bnoguchi/mongoose-auth/commits/master – 2012年2月

这里有google的趋势everyauth,connect-auth和passportjs http://www.google.com/trends/explore?q=passportjs%2C+connect-auth%2C+everyauth#q=passportjs%2C%20connect-auth %2C%20everyauth&CMPT = q

我与每个人的经验:

everyauth更加可configuration。 例如,我想处理我自己的会议。 随着everyauth ,其模块化和内省,一个简单的任务。 另一方面,已经发现everyauth充满了小错误和不完整和/或不正确的文件。 对我而言,每个authentication策略都需要自己的理解和疑难解答。

passport可能是一个很好的select,如果你正在做的一切“的书”。 但是,任何偏离都可能使生活变得非常困难,对我来说 ,这是一个不起眼的问题。