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ámetrostate
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ámetrostate
). - 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?