繁體中文(台灣)
  • 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 對應於最細的權限顆粒度,並針對 role 進行權限檢查。因此,在配置 Logto 時,我們建議將一個 role 映射為正好一個 scope。這種方法可以將 Logto 和 Hasura 的權限聯繫起來,以避免混淆和誤用。

Hasura 可以透過 Webhooks 或 JWT 支援存取控制。我們在之前的部落格文章中介紹了如何使用 Webhooks,接下來的章節將說明如何利用 Hasura 的 JWT 模式存取控制。

開始

讓我們從一個簡單的例子開始。假設某位使用者已經在 Hasura 中有兩個 API,GET /userPATCH /user,對應到兩個角色:user:readeruser:maintainer

1. 在 Logto 中創建 Hasura API 資源

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

Hasura API

2. 根據 Hasura 設置在 Logto 中創建角色

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

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 的 Custom JWT 功能,自訂邏輯以在 JWT 格式的用戶存取權杖中添加額外聲明。

User access token script

自訂 getCustomJwtClaims 方法以在 JWT 中添加 Hasura 依賴於實現存取控制的資料。這可以包含與授權使用者相關的資料,包括他們擁有的 role,可透過 context 存取。

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

5. 整合 Logto SDK

在配置完 Logto 和 Hasura 後,將你的應用程式與 Logto SDK 整合。在這裡,我們使用一個 Next 示例來預覽用戶登入後由 Logto 簽發的存取權杖。

User with roles

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

取得用戶存取權杖並請求 Hasura API:

結論

在本文中,我們提供了一種 Hasura 支援的 JWT 基於方法的存取控制,這是一種不同於 Webhook 的方法。

通過比較 Hasura 的 WebhookJWT 存取控制過程,我們可以看到 Webhook 方法可在每個 Hasura 請求中向 Logto 發送 Webhook 並等待回覆;而基於 JWT 的方法可以持續使用,直到 JWT 過期。

JWT 方法可以減少網路載荷並消除 Webhook 帶來的網路延遲;同時,Webhook 方法可以即時同步用戶權限的變更。

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