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.
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 scope
s 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 role
s. 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.
2. Crear roles según la configuración de Hasura en Logto
Necesitamos crear dos scope
s 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.
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).
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.
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 role
s 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.
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.