¿Es seguro para los usuarios de mi API 'Iniciar sesión con GitHub' usando pasaporte-github?

6

Entiendo que OAuth2 fue diseñado para delegar concesiones de autorización a recursos específicos, solo no es un protocolo de autenticación . Sin embargo, los estados de passport-github README ,

  

Este módulo le permite autenticar utilizando GitHub en sus aplicaciones Node.js. Al conectarse a Passport, la autenticación GitHub se puede integrar de forma fácil y discreta [...]

     

La estrategia de autenticación de GitHub autentica a los usuarios mediante una cuenta de GitHub y tokens OAuth 2.0.

Al utilizar passport-github en mi HelloAPI, los usuarios finales serían dirigidos al servidor de autorización de GitHub para iniciar el flujo de authorization_code de 3 patas:

  • Primero, el usuario se autentica con GitHub y otorga acceso limitado a HelloAPI.
  • GitHub redirige el agente de usuario (navegador) a HelloAPI usando un redirect_uri pre-registrado. El URI de redirección incluye un código de autorización y, opcionalmente, un parámetro state para la detección de falsificación de solicitud entre sitios.
  • HelloAPI intercambia rápidamente el código de un token de acceso, utilizando el client_secret como medio para autenticar HelloAPI con GitHub. (Aquí también debería incluir un parámetro state ).
  • Y, finalmente, HelloAPI usa el token para capturar cualquier perfil de GitHub asociado con ese token.

Aquí asumimos que el token no fue creado por otro cliente y, posteriormente, se volvió a reproducir en HelloAPI como un ataque para hacerse pasar por un propietario de recursos GitHub. Al marcar el parámetro state , creo que es una suposición segura, pero enlace advierte contra haciendo esto:

  

Las API de OAuth no proporcionan ningún mecanismo de restricción de audiencia para la información devuelta. En otras palabras, es muy posible tomar un cliente ingenuo, entregarle el token (válido) de otro cliente y hacer que el cliente ingenuo lo trate como un evento de "inicio de sesión". Después de todo, el token es válido y la llamada a la API devolverá información de usuario válida. Por supuesto, el problema es que el usuario no ha hecho nada para demostrar que está presente y, en este caso, ni siquiera ha autorizado al cliente ingenuo.

Así que esta es mi duda al usar passport-github : utiliza tokens OAuth2 para la autenticación, que es exactamente contra lo que advierten los expertos. La inclusión de un parámetro state parece proteger este flujo de servidor a servidor authorization_code , pero no estoy seguro.

¿Qué me estoy perdiendo? ¿Es segura la autenticación passport-github , o hay alguna manera de hacer que la función "Iniciar sesión con GitHub" sea segura?

    
pregunta Robert Claypool 23.10.2016 - 08:25
fuente

2 respuestas

3

No creo que la implementación de GitHub OAuth2 sea compatible con su caso de uso para autenticar a los usuarios, por lo que, desde el punto de vista de la seguridad y la capacidad de mantenimiento, no creo que sea una gran idea. Desde el primer párrafo de la documentación :

  

OAuth2 es un protocolo que permite que las aplicaciones externas soliciten autorización para acceder a detalles privados en la cuenta de GitHub de un usuario sin obtener su contraseña.

Mi suposición en la discusión a continuación es que el código de autorización y el token de acceso en la implementación de GitHub OAuth2 son opacos para su cliente.

En el escenario de GitHub, tenemos los siguientes roles de OAuth:

  • Servidor de recursos: servidor GitHub que proporciona información de perfil sobre los usuarios
  • Cliente - Tu HelloAPI
  • Servidor de autorización - Servidor de autenticación GitHub
  • Propietario del recurso: su usuario final de la aplicación

La implementación passport-github autentica a un usuario utilizando el token de acceso obtenido por su cliente como parte del flujo de OAuth2 y luego solicita la información del perfil de usuario del servidor de recursos de GitHub en https://api.github.com/user .

Por ejemplo:

  1. Joe Bloggs inicia sesión en GitHub a través de la redirección de su cliente.
  2. El token de acceso que recibe su cliente es opaco y no contiene información sobre la identidad de Joe.
  3. Usted realiza una solicitud al servidor de recursos GitHub desde su cliente para recuperar el perfil asociado con el token de acceso
  4. El servidor de recursos devuelve el perfil de Joe y asume que Joe es la entidad que ha presentado el token de acceso a su cliente.

El problema para mí es que no hay 'evidencia' directa como parte de este proceso para garantizar que la identidad que se autenticó en GitHub como parte del flujo de OAuth sea la misma identidad que se devuelve en la información del perfil utilizada para hacer Su decisión de autenticación en la aplicación. Para mí esto es un error desde la perspectiva de la información integridad , por lo que no lo consideraría "seguro".

Dado que la implementación passport-github no parece ser un escenario de autenticación admitido por GitHub, también crea riesgos en caso de que GitHub cambie su implementación de alguna manera. Es mejor utilizar los protocolos compatibles y las API para los fines previstos para garantizar la seguridad y el mantenimiento.

    
respondido por el feedersec 30.10.2016 - 02:24
fuente
-1

Sí, es tan seguro como cualquier otro inicio de sesión de OAuth siempre que use medidas de seguridad a través de SSL / TLS y como se mencionó, Github también usa HelloAPI, que agrega otro nivel de seguridad que la mayoría de las otras API de inicio de sesión de OAuth. Pasando por otros sitios que podrían usarse, después de leer un poco, ¡es tan seguro como lo conseguirás con este tipo de inicio de sesión!

    
respondido por el WEBelious Network 10.05.2018 - 07:40
fuente

Lea otras preguntas en las etiquetas