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

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

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

Darcy Ye
Darcy Ye
Developer

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 方法可以實時同步用戶許可權的變化。

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