Español
  • hasura
  • api restful
  • graphql
  • logto
  • jwt personalizado
  • control de acceso
  • autorización

Logto x Hasura: Uso de JWT para control de acceso

Esta guía completa describe los pasos involucrados en la integración de Logto con el control de acceso en modo JWT de Hasura, fortaleciendo efectivamente la seguridad de los datos.

Darcy Ye
Darcy Ye
Developer

Hasura es una herramienta que puede proporcionar rápidamente las APIs GraphQL y REST correspondientes a tus datos. Considerando la seguridad de los datos, Hasura también ofrece la capacidad de ajustar el control de acceso para cada API diferente.

Usualmente, los usuarios de Hasura utilizan otros servicios de gestión de identidades y autenticación, siendo Logto uno muy popular entre ellos.

En este post, asumiremos que ya estás utilizando los servicios de Hasura. Te presentaremos cómo integrar Hasura y Logto para maximizar la seguridad de tus datos. ¡Si no tienes una cuenta de Logto, regístrate y comienza a usarla ahora!

Antecedentes

Hasura emplea gestión de acceso basada en roles, mientras que Logto utiliza el estándar Control de acceso basado en roles (RBAC).

En el modelo y las mejores prácticas de Logto para RBAC, aconsejamos a los usuarios que utilicen scope para corresponderse con la granularidad más fina de los permisos, usen role como un conjunto de scopes para operaciones por lotes convenientes, y verifiquen finalmente el scope (usualmente en el lado de los proveedores de recursos) para asegurarse de si un usuario puede realizar una operación específica.

En Hasura, un role corresponde a la granularidad más fina de permisos, y las verificaciones de permisos se realizan contra roles. Por lo tanto, durante la configuración de Logto, recomendamos mapear un role a exactamente un scope. Este enfoque puede vincular los permisos de Logto y Hasura para evitar confusión y mal uso.

Hasura puede admitir control de acceso usando Webhooks o JWT. Nuestro blog post anterior presentó cómo usar Webhooks, y en las siguientes secciones, explicaremos cómo utilizar el control de acceso en modo JWT de Hasura.

Comencemos

Empecemos con un ejemplo sencillo. Supongamos que un usuario ya tiene dos APIs en Hasura, GET /user y PATCH /user, correspondientes a dos roles: user:reader y user:maintainer, respectivamente.

1. Crear recurso API de Hasura en Logto

Crea un recurso API de Hasura en Logto.

API de Hasura

2. Crear roles según la configuración de Hasura en Logto

Necesitamos crear dos scopes para el recurso API de Hasura mencionado en el paso 1, a saber read:user y maintain:user, y luego crear dos roles: user:reader (que contiene el scope read:user) y user:maintainer (que incluye el scope maintain:user) para que correspondan uno a uno con los roles de Hasura. Y asigna estos roles a los usuarios de Logto según sea necesario.

API de Hasura con scopes

Rol del lector de usuarios

Rol del mantenedor de usuarios

3. Configura la variable de entorno HASURA_GRAPHQL_JWT_SECRET de Hasura para habilitar el modo JWT

Tras revisar las opciones de configuración JWT de Hasura, necesitamos agregar y configurar la variable de entorno HASURA_GRAPHQL_JWT_SECRET antes de poder usar JWT para control de acceso.

Hay muchas opciones diferentes que se pueden configurar, pero aquí presentamos el caso más simple: solo se necesita configurar la jwk_url. Este valor se puede obtener desde tu punto final de configuración OpenID de Logto (https://your.logto.domain/oidc/.well-known/openid-configuration).

Configuración de JWT en Hasura

4. Personaliza las reclamaciones extra en el token de acceso del usuario

Usando la función de JWT personalizado de Logto, personaliza la lógica para agregar reclamaciones extra al token de acceso del usuario en formato JWT.

Script de token de acceso del usuario

Personaliza el método getCustomJwtClaims para agregar datos en el JWT de los que Hasura depende para implementar el control de acceso. Esto puede incluir datos relacionados con el usuario que está siendo autorizado durante esa instancia, incluyendo los roles que poseen, los cuales se pueden acceder a través de context.

También hemos definido una variable de entorno USER_DEFAULT_ROLE_NAMES para evitar codificación fija.

5. Integra el SDK de Logto

Después de configurar Logto y Hasura, integra tu aplicación con el SDK de Logto. Aquí usamos un ejemplo en Next para previsualizar el token de acceso del usuario emitido por Logto después de que el usuario haya iniciado sesión.

Usuario con roles

Primero, asignamos los roles user:reader y user:maintainer creados previamente al usuario, y luego iniciamos sesión como ese usuario.

Obtén el token de acceso del usuario y solicita las APIs de Hasura:

Conclusión

En este artículo, proporcionamos otro método de control de acceso basado en JWT admitido por Hasura, aparte de Webhook.

Al comparar los procesos de control de acceso de Hasura usando Webhook y JWT, podemos ver que el enfoque de Webhook envía un Webhook a Logto y espera una respuesta con cada solicitud de Hasura; mientras que el enfoque basado en JWT se puede usar continuamente hasta que el JWT expire.

El enfoque de JWT puede reducir la carga de la red y eliminar la latencia de red que traen los Webhooks; mientras tanto, el enfoque de Webhook puede sincronizar los cambios en los permisos de los usuarios en tiempo real.

Los usuarios pueden elegir el enfoque adecuado basándose en estas conclusiones, combinadas con sus necesidades comerciales reales.