Logto x Hasura:使用 JWT 进行访问控制
本综合指南概述了将 Logto 与 Hasura 的 JWT 模式访问控制集成的步骤,有效增强数据安全性。
Hasura 是一款可以快速提供与数据相适应的 GraphQL 和 REST API 的工具。考虑到数据安全性,Hasura 还提供针对每个不同 API 的精细访问控制能力。
通常,Hasura 用户会利用其他身份管理和认证服务,其中 Logto 是非常受欢迎的一款服务。
在这篇博客文章中,我们假设你已经在使用 Hasura 服务。我们将介绍如何集成 Hasura 和 Logto 以最大限度地提高你数据的安全性。如果你还没有 Logto 账户,立即注册并开始使用吧!
背景
Hasura 采用 基于角色的访问管理,而 Logto 使用标准的 基于角色的访问控制 (RBAC)。
在 Logto 的 RBAC 模型和最佳实践中,我们建议用户使用 scope
来对应权限的最细粒度,用 role
作为一组 scope
,以便于批量操作,并最终检查 scope
(通常在资源提供者一侧)以验证用户是否能够执行特定操作。
在 Hasura 中,role
对应的是权限的最细粒度,权限检查是针对 role
进行的。因此,在配置 Logto 时,我们建议将一个 role
精确映射到一个 scope
。这种方法可以将 Logto 和 Hasura 的权限关联起来,以避免混淆和误用。
Hasura 支持使用 Webhook 或 JWT 进行访问控制。我们之前的 博客文章 介绍了如何使用 Webhook,在接下来的部分中,我们将解释如何利用 Hasura 的 JWT 模式访问控制。
开始
让我们从一个简单的例子开始。假设用户在 Hasura 中已经有两个 API,GET /user
和 PATCH /user
,分别对应两个角色:user:reader
和 user:maintainer
。
1. 在 Logto 中创建 Hasura API 资源
在 Logto 中创建一个 Hasura API 资源。
2. 根据 Hasura 设置在 Logto 中创建角色
我们需要为第1步中提到的 Hasura API 资源创建两个 scope
,即 read:user
和 maintain:user
,然后创建两个角色:user:reader
(包含 read:user
scope)和 user:maintainer
(包含 maintain:user
scope),以一对一对应 Hasura 的角色。并根据需要将这些角色分配给 Logto 用户。
3. 配置 Hasura 环境变量 HASURA_GRAPHQL_JWT_SECRET
以启用 JWT 模式
通过查看 Hasura JWT 配置选项,我们需要在使用 JWT 进行访问控制之前添加并配置环境变量 HASURA_GRAPHQL_JWT_SECRET
。
有许多不同的选项可以配置,但这里我们介绍最简单的情况:只需配置 jwk_url
即可。此值可以从你的 Logto 的 OpenID 配置端点(https://your.logto.domain/oidc/.well-known/openid-configuration)中获取。
4. 自定义用户访问令牌的额外声明
使用 Logto 的自定义 JWT 功能,自定义逻辑以向 JWT 格式的用户访问令牌添加额外的声明。
自定义 getCustomJwtClaims
方法以在 JWT 中添加 Hasura 依赖于实现访问控制的数据。这可以包含与当时授权的用户相关的数据,包括他们拥有的 role
,可以通过 context
访问。
我们还定义了一个环境变量 USER_DEFAULT_ROLE_NAMES
以避免硬编码。
5. 集成 Logto SDK
配置好 Logto 和 Hasura 后,请将你的应用与 Logto SDK 集成。在这里,我们使用一个 Next 示例来预览用户在登录后由 Logto 签发的用户访问令牌。
首先,我们将之前创建的 user:reader
和 user:maintainer
角色分配给用户,然后以该用户身份登录。
获取用户访问令牌并请求 Hasura API:
结论
在本文中,我们提供了 Hasura 支持的另一种基于 JWT 的访问控制方法,而不是 Webhook。
通过比较 Hasura 的 Webhook 和 JWT 访问控制的过程,我们可以看到 Webhook 方法在每个 Hasura 请求中都会发送一个 Webhook 到 Logto,并等待响应;而基于 JWT 的方法则可以持续使用,直到 JWT 过期。
JWT 方法可以减少网络负载并消除 Webhook 带来的网络延迟;同时,Webhook 方法可以实时同步用户权限的变化。
用户可以根据这些结论,结合实际业务需求来选择适当的方法。