Cómo usar PassportJS con JWT en una API REST
Actualmente estoy trabajando en la construcción de una API REST donde los usuarios pueden autenticarse a través de diferentes estrategias de passport (google, facebook). La autenticación debe realizarse sin una sesión.
Ya he trabajado en la estrategia local y funciona de la siguiente manera: la aplicación envía una solicitud POST /login a la API y cuando el usuario ingresa las credenciales correctas, recibe una carga útil como esta:
[
{
“tokenType”: “refresh”,
“expiresIn”: 604800000,
“token”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTUsImlhdCI6MTY0MDc4NzA4MCwiZXhwIjoxNjQxMzkxODgwfQ.zdxdpX8NkiSTsbZj0xOd18RdbLjeSsQpkikLGW71xrE”
},
{
“tokenType”: “access”,
“expiresIn”: 7200000,
“token”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTUsImlhdCI6MTY0MDc4NzA4MCwiZXhwIjoxNjQwNzk0MjgwfQ.EBDuJqQYT-D0bnYbC76_khe6b29c80R4pMyEaBNKLKE”
}
]
Sin embargo, el problema con las estrategias de Google y Facebook es que funcionan a través de OAuth. Me resulta difícil encontrar una forma de enviar la información anterior (como lo hice con mi estrategia local) al cliente después de que la autenticación de OAuth haya tenido éxito.
Estos servicios de OAuth trabajan con una URL de retorno como /auth/facebook/return. Pero esta URL de retorno está en la API, que luego no puede enviar la información al cliente (¿o sí?).
¿Cómo puedo hacer esto?
davy.ai
Para enviar la carga de autenticación al cliente después de que la autenticación de OAuth haya tenido éxito, puedes utilizar JSON Web Tokens (JWT).
Cuando un usuario se autentica mediante OAuth a través de Facebook o Google, la API puede generar un JWT que contenga la información del usuario y enviarlo de vuelta al cliente como respuesta. El cliente puede luego almacenar el JWT en almacenamiento local o en una cookie, y enviarlo con cada solicitud subsiguiente para autenticar al usuario.
Para implementar la autenticación con JWT utilizando
passport.js
, puedes utilizar la estrategiapassport-jwt
. Esta estrategia valida los JWT y extrae la información del usuario de ellos. La estrategia puede ser utilizada junto conpassport-facebook
opassport-google-oauth
para habilitar la autenticación de OAuth con JWT.Cuando el usuario es redirigido al punto final
/auth/facebook/return
o/auth/google/return
de la API después de una autenticación exitosa, la API puede generar un JWT y enviarlo de vuelta al cliente. El cliente puede entonces extraer el JWT, almacenarlo y enviarlo con cada solicitud subsiguiente a los puntos finales autenticados.En general, utilizar JWT para la autenticación te permite implementar la autenticación de OAuth sin sesiones y aún proporcionar un mecanismo de autenticación seguro y sin estado para tu API REST.