Node.js: Connect-Auth VS. EveryAuth
node express api boilerplate (5)
Mi experiencia con cada uno:
everyauth
es mucho más configurable. Por ejemplo, deseo manejar mis propias sesiones. Con everyauth
, con su modularidad e introspección, una tarea sencilla. Por otro lado, hemos encontrado todos los errores llenos de errores menores y documentación incompleta o incorrecta. Para mí, cada estrategia de autenticación ha requerido su propia comprensión y solución de problemas.
passport
podría ser una buena apuesta si está haciendo todo "por el libro". Pero cualquier desviación podría hacer la vida muy difícil muy rápidamente, por lo que, para mí , no es un motor de arranque.
¿Alguien puede dar una buena comparación entre: https://github.com/ciaranj/connect-auth y https://github.com/bnoguchi/everyauth
Las que parecen ser las únicas opciones para express / connect
Pasé una mañana jugando con everyauth y mongoose-auth para encontrar que los ejemplos estaban en quiebra y que eran proyectos muertos. Aquí están las historias de cometer:
https: // github.com/jaredhanson/passport/commits/master - 5 de junio (es el 18 de junio) https: // github.com/ciaranj/connect-auth/commits/master - 18 de abril (hace 2 meses) https: // github.com/bnoguchi/mongoose-auth/commits/master - febrero de 2012
Aquí hay un Google Trends de everyauth, connect-auth y passportjs http://www.google.com/trends/explore?q=passportjs%2C+connect-auth%2C+everyauth#q=passportjs%2C%20connect-auth%2C%20everyauth&cmpt=q
Pensé en mencionar que ahora hay un nuevo jugador en la ciudad llamado PassportJS que presenta muchos de los mismos beneficios que todos los proveedores de autenticación, sin embargo, los módulos de npm brindan los proveedores de npm, por lo tanto optin en lugar de incluir todo.
Soy el autor de everyauth
.
Escribí everyauth
porque encontré el uso de connect-auth
en términos de:
Configuración fácil y potente.
Para concretar, un área donde faltaba en términos de configuración era establecer dinámicamente la configuración de seguridad de "alcance" de Facebook.
Buen soporte de depuración
Encontré que
connect-auth
no es tan sencillo de depurar en términos de localizar la parte del proceso de autenticación que estaba fallando. Esto se debe principalmente a la forma en que connect-auth configura sus devoluciones de llamada anidadas.
Con everyauth, intenté crear un sistema que resolviera los problemas que encontré con connect-auth.
En la configuración : cada módulo de autenticación de everyauth se define como una serie de pasos y parámetros configurables. Como resultado, tiene una precisión similar a la cirugía sobre qué parámetros (por ejemplo, nombre de host, url de devolución de llamada, etc.) o pasos (por ejemplo, getAccessToken, addToSession) que desea modificar. Con
connect-auth
, si desea cambiar una cosa además de los pocos parámetros configurables incorporados que proporciona cada estrategia de autenticación, debe volver a escribir toda la funciónthis.authenticate
que define la lógica de toda esa estrategia. En otras palabras, tiene menos precisión de configurabilidad queeveryauth
. En otros casos, no puede usarconnect-auth
, tal como está, por ejemplo, logrando una configuración de "alcance" de facebook dinámica, es decir, pedir a los usuarios más permisos de facebook progresivamente a medida que llegan a partes de su aplicación que requieren más permisos.Además de los pasos y parámetros configurables, también puede aprovechar la herencia del módulo de autenticación de
everyauth
. Todos los módulos se heredan prototípicamente del módulo de autenticación de todos los módulos. Todos los módulos basados en OAuth2 heredan del módulo oauth2. Digamos que quiere que todos los módulos oauth2 se comporten de manera diferente. Todo lo que necesita hacer es modificar el módulo de autenticación oauth2, y todos los módulos basados en oauth2 heredarán ese nuevo comportamiento.Sobre la depuración :
everyauth
, en mi opinión, tiene una mejor visibilidad de la depuración debido al hecho de que segmenta cada módulo explícitamente en los pasos de los que está compuesto. Configurandoeveryauth.debug = true;
obtienes información sobre los pasos que se han completado en el proceso de autenticación y cuáles han fallado. También tiene control granular sobre cuánto tiempo tiene cada paso en cada estrategia de autenticación antes de que se agote el tiempo.
Sobre la extensibilidad : diseñé Everyauth para maximizar la reutilización del código. Como se mencionó anteriormente, todos los módulos heredan prototípicamente del módulo de autenticación de todos los módulos. Esto significa que puede lograr sistemas muy modulares y al mismo tiempo tener un control preciso en términos de superar un paso específico de un módulo ancestral. Para ver lo fácil que es extender Everyauth con su propio módulo de autenticación, simplemente eche un vistazo a cualquiera de los módulos de autenticación específicos en la fuente de Everyauth.
Sobre la legibilidad : me parece que
everyauth
fuente es más fácil de leer en términos de lo que está sucediendo. Conconnect-auth
, me encontré saltando alrededor de varios archivos para comprender en qué contextos (es decir, durante qué pasos, en todos loseveryauth
) seeveryauth
cada devolución de llamada anidada configurada por una estrategia. Coneveryauth
, usted sabe exactamente qué parte de la lógica está asociada con qué contexto (también conocido como paso). Por ejemplo, aquí está el código que describe lo que sucede cuando un proveedor oauth2 redirige a su servicio:.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)
Sin necesidad de explicar cómo funciona esto, es bastante sencillo ver lo que hace una estrategia oauth2. ¿Quieres saber qué hace getCode? La fuente de nuevo es muy sencilla:
.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; })
Compare todo esto con el código de Facebook de
connect-auth
, que para mí al menos me tomó más tiempo del que pensé que debía tener para averiguar qué se ejecuta cuando. Esto se debe principalmente a la forma en que el código se distribuye en los archivos y al uso de un único método deauthenticate
y devoluciones de llamadas anidadas para definir la lógica de autenticación (everyauth
utilizan promesas para dividir la lógica en pasos fáciles de digerir):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); } }
Algunas otras diferencias :
-
everyauth
admite laeveryauth
tradicional basada en contraseña.connect-auth
, a partir de este escrito, no lo hace. - El soporte de foursquare y google en connect-auth se basa en la especificación OAuth1.a más antigua.
everyauth
foursquare y google deeveryauth
se basan en sus implementaciones de la nueva especificación OAuth2. - Soporte de
everyauth
en todos loseveryauth
. - La documentación de everyauth es mucho más completa que la de connect-auth.
Finalmente, para comentar sobre la respuesta de Nathan, que no estaba segura de que everyauth
los proveedores everyauth
múltiples proveedores al mismo tiempo, everyauth
admiten múltiples proveedores concurrentes. El README en la página de github de everyauth proporciona instrucciones sobre cómo usar everyauth
para lograr esto.
Para concluir, creo que la elección de las bibliotecas depende del desarrollador. Yo, y otros, encontramos a everyauth
más poderosos desde su punto de vista. Como ilustra la respuesta de Nathan, otros encuentran que connect-auth
más sintonizado con sus preferencias. Sea cual sea su elección, espero que este artículo sobre por qué escribí everyauth
ayude en su decisión.
Ambas bibliotecas son bastante cercanas en cuanto a conjuntos de características, especialmente en términos de proveedores compatibles. connect-auth
brinda asistencia inmediata para que usted pueda hacer sus propios proveedores de oAuth, de modo que eso podría ayudarlo si va a necesitar ese tipo de cosas.
Lo principal que he notado entre los dos es que me parece que connect-auth
mucho más limpio con la forma en que crea y acepta el middleware; solo tiene que mirar la cantidad de preconfiguración requerida para el middleware en todos los everyauth
para ver que se va a ensuciar.
Otra cosa que no está clara es si everyauth
admite múltiples proveedores al mismo tiempo; con connect-auth
, parece posible / más sencillo, aunque todavía no lo he probado.