Node.js:Connect Auth VS.EveryAuth
有人能很好地比较一下: 及Node.js:Connect Auth VS.EveryAuth,node.js,Node.js,有人能很好地比较一下: 及 这似乎是/的唯一选项,这两个库在功能集上非常接近,特别是在受支持的提供者方面connectauth提供了开箱即用的支持来创建自己的oAuth提供程序,因此,如果您需要这种东西,它可以很好地帮助您 在这两者之间我注意到的主要一点是,我发现connectauth创建和接受中间件的方式更加简洁;您只需在everyauth中查看中间件所需的预配置量,就可以看出它会变得一团糟 另一件不清楚的事情是everyauth是否同时支持多个提供者;使用connectauth,这似乎是可能
这似乎是/的唯一选项,这两个库在功能集上非常接近,特别是在受支持的提供者方面
connectauth
提供了开箱即用的支持来创建自己的oAuth提供程序,因此,如果您需要这种东西,它可以很好地帮助您
在这两者之间我注意到的主要一点是,我发现connectauth
创建和接受中间件的方式更加简洁;您只需在everyauth
中查看中间件所需的预配置量,就可以看出它会变得一团糟
另一件不清楚的事情是
everyauth
是否同时支持多个提供者;使用connectauth
,这似乎是可能的/更简单,尽管我自己还没有尝试过。我是everyauth
的作者
我写了everyauth
,因为我发现使用connectauth
缺乏以下方面:
connectauth
在确定auth进程失败的部分方面,调试起来并不那么简单。这主要是由于connect auth设置其嵌套回调的方式- 关于配置-每个everyauth auth模块都定义为一系列步骤和可配置参数。因此,对于需要更改的参数(例如主机名、回调url等)或步骤(例如getAccessToken、addToSession),您具有外科手术般的精确度。使用
,除了每个auth策略提供的几个内置可配置参数外,如果您想更改一件事,则必须重新编写整个connect auth
函数,该函数定义了所有该策略的逻辑。换句话说,它的可配置性精度不如this.authenticate
。在其他情况下,您不能按原样使用everyauth
——例如,实现动态facebook“scope”可配置性——即,当用户访问您的应用程序中需要更多权限的部分时,逐步要求用户获得更多facebook权限 除了可配置的步骤和参数外,您还可以利用connect auth
的auth模块继承。所有模块都从everymodule auth模块继承原型。所有基于OAuth2的模块都继承自OAuth2模块。假设您希望所有oauth2模块的行为都不同。您所需要做的就是修改oauth2身份验证模块,所有基于oauth2的模块都将从中继承新的行为everyauth
- 关于调试-
具有更好的调试可视性,因为它将每个模块明确地划分为其组成的步骤。通过设置在我看来,everyauth
您将获得身份验证过程中哪些步骤已完成,哪些步骤已失败的输出。您还可以对每个auth策略中的每个步骤在超时之前的时间进行精确控制everyauth.debug = true;
- 关于可扩展性-我设计了everyauth以最大限度地提高代码重用率。如前所述,所有模块都从everymodule auth模块继承原型。这意味着您可以实现非常模块化的系统,同时在超越祖先模块的特定步骤方面进行细粒度控制。要了解使用自己的auth模块扩展everyauth有多容易,只需查看everyauth源代码中的任何特定auth模块
- 关于可读性-我发现
源代码更易于阅读。使用everyauth
,我发现自己在几个文件中跳跃,以了解策略配置的每个嵌套回调在什么上下文下运行(即,在什么步骤中,用connectauth
的说法)。使用everyauth
,您可以准确地知道与哪个上下文相关联的逻辑片段(也称为步骤)。例如,下面的代码描述了oauth2提供程序重定向回您的服务时发生的情况:everyauth
不需要解释它是如何工作的,很容易就可以看到oauth2策略的作用。想知道getCode做什么吗?来源同样非常简单:.get('callbackPath', 'the callback path that the 3rd party OAuth provider redirects to after an OAuth authorization result - e.g., "/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)
将这一切与.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; })
的facebook代码进行比较,至少对我来说,它花费了比我想象的更多的时间来确定何时执行。这主要是因为代码在文件中的传播方式,以及使用单个connectauth
方法和嵌套回调来定义身份验证逻辑(authenticate
使用承诺将逻辑分解为易于理解的步骤):everyauth
支持传统的基于密码的身份验证<代码>连接身份验证,在撰写本文时还没有everyauth
- connect auth中的foursquare和google支持基于较旧的OAuth1。规范
的foursquare和google模块基于较新的OAuth2规范的实现everyauth
中的OpenId支持everyauth
- everyauth的文档比connect auth的文档更全面
everyauth
确实支持多个并发提供者,对此进行评论。上的自述文件
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);
}
}