Autenticación de JSON Web Tokens en GraphQL con Passport

Clase 19 de 24Curso de GraphQL con Node.js

Resumen

¿Cómo validar los JSON Web Tokens en GraphQL?

La validación de JSON Web Tokens (JWT) es crucial en cualquier arquitectura de GraphQL que requiera autenticación y autorización para el acceso seguro a recursos. En primer lugar, los JWT son utilizados tanto para autenticar como para autorizar a los usuarios. La diferencia es que la autenticación verifica la identidad del usuario, permitiéndole acceder al sistema, mientras que la autorización define qué acciones puede realizar ese usuario dentro del sistema.

¿Cómo se realiza la autenticación con JWT?

En la autenticación, se verifica la validez de un JWT para permitir el acceso a ciertos endpoints. Este processo ya se introdujo en la sección de login, donde un usuario obtiene un access token. La idea es enviar este token a GraphQL y verificar su validez para mantener la sesión activa y poder entrar en el sistema. Para ello, necesitas seguir ciertos pasos:

  • Uso de Passport: Al igual que en los routers de crear categorías, se utiliza Passport para autenticar. Esto implica validar el JWT y luego, opcionalmente, verificar roles y tipos de datos.
  • Estrategias de Passport: Dentro de Passport, puedes definir tres estrategias de autenticación:
    • Local para REST API.
    • Local para GraphQL.
    • JWT Strategy.

¿Cómo se integra JWT con el contexto de GraphQL?

Dentro del contexto de GraphQL, puedes llamar a las estrategias definidas para autenticación. Esto se hace de una manera bastante parecida al router:

context.authenticate('jwt', { session: false }, (error, user) => {
  if (error || !user) throw Boom.unauthorized('JWT is not valid');
  return user;
});

Aquí, se invoca a JWT Strategy sin manejar sesiones debido a la naturaleza stateless de JWT. Esto significa que la sesión depende únicamente del token y su expiración.

¿Cómo se garantiza que solo usuarios autenticados accedan a mutation?

El token o access token se envía en los headers mediante la autenticación, clave para autorizar un request. Por ejemplo, al crear una categoría, el token asociado al usuario que se autenticó debe ser válido, caso contrario, se lanza un error o se desautoriza la operación.

  • Códigos de error con Boom: Para tratar errores como el uso de un token inválido, se usa Boom para lanzar un mensaje de error de autenticación inautorizada. Ejemplo: Boom.unauthorized('JWT not valid').

¿Cómo enviar y validar un JWT desde los headers?

La autorización y el access token se envían a través de los headers. En una REST API así como en GraphQL, se maneja de la siguiente manera:

Headers: {
  Authorization: 'Bearer ' + accessToken
}
  • El access token: Este token demuestra que el usuario está autenticado y su sesión activa. Si cambias el contenido o firma de este token, la solicitud es rechazada.

¿Qué sigue después de la autenticación?

Una vez asegurada la autenticación con JWT, el siguiente paso es implementar la autorización. Esto involucra validar si el usuario tiene un rol específico que le permita realizar ciertas acciones, como crear una categoría dentro de GraphQL.

La implementación efectiva de JWT no solo mejora la seguridad de las aplicaciones, sino que también permite un manejo más organizado y detallado del acceso a recursos dentro de sistemas complejos. Te animo a seguir explorando y mejorando tus habilidades en esta emocionante área de desarrollo de software.