¿Cómo se maneja la autenticación (local y Facebook, por ejemplo) usando passport.js, a través de una API RESTful en lugar de a través de una interfaz web?
Las preocupaciones específicas son manejar el paso de datos de devoluciones de llamada a una respuesta RESTful (JSON) en lugar de usar un típico res.send ({data: req.data}), configurar un punto final inicial / de inicio de sesión que redirige a Facebook (/ login no puede ser accedido a través de AJAX, porque no es una respuesta JSON, es una redirección a Facebook con una devolución de llamada).
Encontré https://github.com/halrobertson/test-restify-passport-facebook , pero tengo problemas para entenderlo.
Además, ¿cómo almacena passport.js las credenciales de autenticación? El servidor (¿o es servicio?) Está respaldado por MongoDB, y espero que las credenciales (inicio de sesión y hash salado de pw) se almacenen allí, pero no sé si passport.js tiene este tipo de capacidad.
fuente
passport-facebook
. Después de que funcione, el siguiente paso es comenzar a comprender cómo funciona Passport y cómo almacena las credenciales. Conectarlo a Restify ( vea aquí una versión actualizada de la que menciona) sería uno de los últimos pasos (o podría implementar la interfaz REST en Express).Respuestas:
Aquí se hacen muchas preguntas, y parece que a pesar de que las preguntas se hacen en el contexto de Node and passport.js, las preguntas reales se refieren más al flujo de trabajo que a cómo hacerlo con una tecnología en particular.
Usemos la configuración de ejemplo @Keith, modificada un poco para mayor seguridad:
https://example.com
sirve una aplicación de cliente Javascript de una sola páginahttps://example.com/api
proporciona soporte de servidor a la aplicación de cliente enriquecidohttps://example.com/api
https://example.com/api
pero no conocen el servidor web enhttps://example.com
.Tenga en cuenta que estoy usando HTTP seguro. En mi opinión, esto es imprescindible para cualquier servicio que esté disponible al aire libre, ya que la información confidencial como las contraseñas y los tokens de autorización se transfieren entre el cliente y el servidor.
Autenticación de nombre de usuario / contraseña
Veamos primero cómo funciona la autenticación antigua simple.
https://example.com
https://example.com/api
para obtener los datos específicos del usuario para representar en la página. Cada solicitud que envíen al servicio web incluirá el nombre de usuario y la contraseña, posiblemente en forma de autenticación HTTP básica , ya que el servicio RESTful no puede mantener el estado del cliente de una solicitud a la siguiente. Dado que el servicio web está en HTTP seguro, la contraseña se cifra de forma segura durante el tránsito.https://example.com/api
recibe un montón de solicitudes individuales, cada una con información de autenticación. El nombre de usuario y la contraseña en cada solicitud se comparan con la base de datos del usuario y, si se encuentra correcta, la función solicitada se ejecuta y los datos se devuelven al cliente en formato JSON. Si el nombre de usuario y la contraseña no coinciden, se envía un error al cliente en forma de un código de error 401 HTTP.El punto importante de este ejemplo es que los servicios web RESTful requieren autenticación con cada solicitud .
Una capa adicional de seguridad en este escenario agregaría la autorización de la aplicación del cliente además de la autenticación del usuario. Por ejemplo, si tiene el cliente web, las aplicaciones iOS y Android que usan el servicio web, es posible que desee que el servidor sepa cuál de los tres es el cliente de una solicitud determinada, independientemente de quién sea el usuario autenticado. Esto puede permitir que su servicio web restrinja ciertas funciones a clientes específicos. Para esto, puede usar claves y secretos de API, consulte esta respuesta para obtener algunas ideas al respecto.
Autenticación de Facebook
El flujo de trabajo anterior no funciona para Facebook Connect porque el inicio de sesión a través de Facebook tiene un tercero, el propio Facebook. El procedimiento de inicio de sesión requiere que el usuario sea redirigido al sitio web de Facebook donde las credenciales se ingresan fuera de nuestro control.
Así que veamos cómo cambian las cosas:
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
ruta es manejada por passport.js (ver la documentación )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
ruta invocará la función de devolución de llamada que recibe el token de acceso de Facebook y cierta información del usuario de Facebook, incluida la dirección de correo electrónico del usuario.https://example.com/api
incluirán el token de acceso de Facebook para autenticación, o el token de acceso propio de la aplicación generado a partir del token de Facebook a través de una función "get_access_token" en la API REST.Espero que esto responda la mayoría de las preguntas. Por supuesto, puede reemplazar Facebook con Twitter, Google o cualquier otro servicio de autenticación basado en OAuth.
Me interesaría saber si alguien tiene una forma más sencilla de lidiar con esto.
fuente
Every single request they send to the web service will include the username and password
y, sin embargo, lo diceyou can have a "get_access_token" function in your RESTful service
. Parece contradictorio decir que REST debe ser apátrida, pero almacenar tokens de acceso del lado del servidor está bien, ya que ese acto de almacenar tokens de acceso significa que el servidor ahora tiene estado. Agradecería cualquier aclaración o justificación con respecto a esto. ¡Gracias! :)Agradezco enormemente la explicación de @Miguel con el flujo completo en cada caso, pero me gustaría agregar algo en la parte de autenticación de Facebook.
Facebook proporciona un SDK de Javascript que puede usar para obtener el token de acceso en el extremo del cliente directamente, que luego se pasa al servidor y se utiliza para extraer toda la información del usuario de Facebook. Por lo tanto, no necesita ninguna redirección básicamente.
Además, también puede usar el mismo punto final de API para aplicaciones móviles. Simplemente use el SDK de Android / iOS para Facebook, obtenga el acceso_token de Facebook en el extremo del cliente y páselo al servidor.
Con respecto a la naturaleza sin estado como se explicó, cuando get_access_token se usa para generar un token y se pasa al cliente, este token también se almacena en el servidor. Entonces, ¿es tan bueno como un token de sesión y creo que esto lo hace con estado?
Solo mis 2 centavos ..
fuente
Aquí hay un artículo increíble que encontré que puede ayudarlo a autenticarse con:
Autenticación de nodo fácil: configuración y local
fuente