繁體中文(香港)
  • hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • access control
  • authorization

Logto x Hasura:使用 JWT 進行訪問控制

本綜合指南概述了將 Logto 與 Hasura 的 JWT 模式訪問控制集成的步驟,有效地增強了數據安全性。

Darcy Ye
Darcy Ye
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

Hasura 是一個可以快速提供對應的 GraphQL 和 REST API 以適應你的數據的工具。考慮到數據安全性,Hasura 也提供了為每個不同的 API 進行訪問控制的微調能力。

通常,Hasura 用戶會使用其他身份管理和身份驗證服務,Logto 是其中非常受歡迎的一個。

在這篇博客文章中,我們將假設你已經在使用 Hasura 服務。我們將介紹如何將 Hasura 和 Logto 集成,以最大限度地提高你的數據安全性。如果你還沒有 Logto 帳戶,立即註冊並開始使用吧!

背景

Hasura 使用 基於角色的訪問管理,而 Logto 使用標準的 基於角色的訪問控制(RBAC)

在 Logto 的 RBAC 模型和最佳實踐中,我們建議用戶使用 scope 對應到許可權的最細粒度,使用 role 作為一組 scope 方便進行批量操作,並最終檢查 scope(通常在資源提供者一側)來驗證用戶是否可以執行特定操作。

在 Hasura 中,role 對應於許可權的最細粒度,並對 roles 進行許可權檢查。因此,在 Logto 的配置過程中,我們建議將一個 role 映射到一個 scope。這種方法可以將 Logto 和 Hasura 的許可權連結在一起,以避免混淆和誤用。

Hasura 可以使用 Webhooks 或 JWT 支援訪問控制。我們之前的 博客文章 介紹了如何使用 Webhooks,在接下來的部分,我們將解釋如何利用 Hasura 的 JWT 模式訪問控制。

開始使用

讓我們從一個簡單的例子開始。假設一個用戶在 Hasura 中已經擁有兩個 API,GET /userPATCH /user,分別對應兩個 roles:user:readeruser:maintainer

1. 在 Logto 創建 Hasura API 資源

在 Logto 中創建一個 Hasura API 資源。

Hasura API

2. 在 Logto 根據 Hasura 設置創建 roles

我們需要為步驟1中提到的 Hasura API 資源創建兩個 scope,即 read:usermaintain:user,然後創建兩個 roles:user:reader(包含 read:user scope)和 user:maintainer(包含 maintain:user scope)以一對一對應 Hasura 的 roles。並根據需要為 Logto 用戶分配這些 roles。

Hasura API with scopes

User reader role

User maintainer role

3. 配置 Hasura 環境變量 HASURA_GRAPHQL_JWT_SECRET 以啟用 JWT 模式

通過查看 Hasura JWT 配置選項,我們需要添加和配置環境變量 HASURA_GRAPHQL_JWT_SECRET 才能使用 JWT 進行訪問控制。

有很多不同的選項可以配置,但這裡我們介紹最簡單的情況:只需配置 jwk_url。該值可以從你的 Logto 的 OpenID 配置端點獲得(https://your.logto.domain/oidc/.well-known/openid-configuration)。

Hasura JWT config

4. 定制用戶訪問令牌額外聲明

使用 Logto 的自定義 JWT 功能,定制邏輯以將額外的聲明添加到 JWT 格式的用戶訪問令牌中。

User access token script

定制 getCustomJwtClaims 方法在 JWT 中添加 Hasura 用於實現訪問控制所依賴的數據。這可以包括在那個實例中被授權的用戶相關的數據,包括他們擁有的 roles,可以通過 context 訪問。

我們還定義了一個環境變量 USER_DEFAULT_ROLE_NAMES 以避免硬編碼。

5. 集成 Logto SDK

配置 Logto 和 Hasura 後,將你的應用集成到 Logto SDK。這裡我們使用一個 Next 示例來預覽用戶登錄後由 Logto 發出的用戶訪問令牌。

User with roles

首先,我們將先前創建的 user:readeruser:maintainer roles 分配給用戶,然後以該用戶身份登入。

獲取用戶訪問令牌並請求 Hasura APIs:

結論

在這篇文章中,我們提供了 Hasura 支援的另一種基於 JWT 的訪問控制方法,除了 Webhook 之外。

通過比較 Hasura 的 WebhookJWT 訪問控制的過程,我們可以看到 Webhook 方法對每個 Hasura 請求發送一個 Webhook 給 Logto 並等待回應,而基於 JWT 的方法可以持續使用直到 JWT 過期。

JWT 方法可以減少網絡負載並消除由 Webhook 帶來的網絡延遲;同時,Webhook 方法可以實時同步用戶許可權的變化。

用戶可以根據這些結論,結合他們的實際業務需求,選擇合適的方法。