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 可以透過 Webhooks 或 JWT 支援存取控制。我們在之前的部落格文章中介紹了如何使用 Webhooks,接下來的章節將說明如何利用 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 配置選項,我們需要添加並配置環境變數 HASURA_GRAPHQL_JWT_SECRET
才能使用 JWT 進行存取控制。
有許多不同的選項可以配置,但這裡我們介紹最簡單的情況:只需配置 jwk_url
。這個值可以從 Logto 的 OpenID 配置端點(https://your.logto.domain/oidc/.well-known/openid-configuration)中獲得。
4. 自訂用戶存取權杖的額外聲明
使用 Logto 的 Custom 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 請求中向 Logto 發送 Webhook 並等待回覆;而基於 JWT 的方法可以持續使用,直到 JWT 過期。
JWT 方法可以減少網路載荷並消除 Webhook 帶來的網路延遲;同時,Webhook 方法可以即時同步用戶權限的變更。
用戶可以根據這些結論,結合實際的業務需求選擇合適的方法。