繁體中文(香港)
  • graphql
  • hasura
  • api

Logto x Hasura: 如何使用開源身份驗證 + GraphQL 解決方案提升你的項目

在本文中,我們將專注於連接 Logto 和 Hasura,這使你能夠毫無障礙地實現身份驗證、授權和 GraphQL API。因此,你可以迅速投入到業務中,而無需學習艱深的技術。

Gao
Gao
Founder

介紹

當開始一個新項目時,你通常無法跳過幾件事情:API、身份驗證 + 授權、身份和終端用戶登錄流程。過去,很難啟動這些事情,因為有許多概念和技術廣泛傳播:RESTful/GraphQL,網頁前端,原生客戶端,將客戶端與 API 連接,身份驗證最佳實踐以平衡安全性和用戶體驗等等。

此外,大部分工作都是“重複性”的。我的意思是,幾乎每個項目都需要它們,而且相似,只需稍作調整。

聽起來可怕又繁瑣?不要驚慌。今天我們有開源。通過下面的兩個開源項目,事情變得不再棘手:

  • Logto:幫助你在幾分鐘內建立登錄、身份驗證和用戶身份。
  • Hasura:為你的資料庫提供快速而即時的 GraphQL API,並具有精細的訪問控制。

在本文中,我們將專注於連接 Logto 和 Hasura,這使你能夠毫無障礙地實現身份驗證、授權和 GraphQL API。因此,你可以迅速投入到業務中,而無需學習艱深的技術。

開始

先決條件

由於 LogtoHasura 都有不錯的入門指南,我們假設你已經閱讀過這些指南並有基本的了解。需要運行中的實例。

我們假定可訪問的端點是:

  • Logto:http://localhost:3001
  • Hasura:http://localhost:8080

此外,我們假設你有一個平台和框架來構建客戶端應用,例如 React 或 Next.js。

在 Logto 中設置 API

在你的 Logto Admin Console 左側導航欄上,點擊 “API 資源”,你將看到 API 資源管理頁面。

接著點擊右上角的 “+ 創建 API 資源” 按鈕。在打開的模式中,輸入 Hasura 作為 API 名稱以及 https://hasura.api 作為 API 識別符。

Create API modal

我們將在文章的其餘部分使用該 API 標識符。但可以根據偏好更改值。

點擊 “創建 API 資源”,將顯示一條消息,指示資源已成功創建。這就是我們在 Logto 中目前需要的所有。

為 Hasura 創建角色

為了利用 Hasura 的權限管理,我們將在 Logto 中創建角色,這些角色將映射到 Hasura 的角色。

Create Role

記得將角色指派給用戶。

在 Hasura 中啟用 webhook 身份驗證

Hasura 使用基於角色的訪問管理,來處理授權。因此,我們只需弄清楚身份驗證。它支持兩種方法:Webhook 和 JWT。我們選擇 webhook,因為它更靈活。

要啟用 webhook 身份驗證,你必須設置管理密鑰和身份驗證 hook 端點。

  • 管理密鑰是在發送請求時獲得 Hasura 管理員訪問權限的金鑰。在啟用 webhook 身份驗證之前,它是必需的。記得把它放在安全的地方,不要在生產環境中使用它。
  • 身份驗證 hook 端點是一個 URL 用於發送身份驗證請求。

你可以通過 環境變數 來設置它們:

你可能注意到,我們使用在 Logto 中填寫的 API 識別符來構建身份驗證 hook 端點。這確保用戶傳遞的是正確的 bearer token,而不是可能從惡意來源來的一個隨機 token。

如果你有不同的 Logto 端點或 API 標識符,需要更新身份驗證 hook 端點。例如,你有 https://logto.domain.com 作為 Logto 端點以及 https://graphql.domain.com 作為 API 識別符,則它將是:

從現在起,對於每個 GraphQL 請求,Hasura 會將所有請求標頭帶到 Logto 身份驗證 hook 端點,Logto 將做出正確的回應。

發送安全的 GraphQL 請求

總結

由於我們不會在生產環境中使用 Hasura 管理密鑰,每個 GraphQL 請求都由以下標頭來保護:

  • Authorization 由 Logto 生成的標準 bearer token。
  • Expected-Role 你希望 Logto 在身份驗證 hook 回應中顯示的角色。

Authorization 標頭需要一個有效的 JWT 格式 Access Token 和 Hasura API 標識符作為受眾。慢著——記住並組合這些內容有點困難。幸運的是,我們有 Logto SDK 來簡化這些技術部分。

整合 Logto SDK

遵循 整合指南 在你的客戶端應用中整合 Logto SDK。這不僅能生成用於 GraphQL 請求的有效 Access Token,還能為你的終端用戶提供流暢的登錄體驗。

完成指南後,我們需要對 LogtoConfig 做一個小修改:將你在 Logto Admin Console 中創建的 API 識別符添加到 resources。以 React SDK 為例:

發送請求

最終!用戶登錄後,使用 Logto SDK 中的 getAccessToken() 來獲取用於 Hasura GraphQL 請求的 Access Token:

回顧

通過上述努力,我們成功實現了介紹中的所有不可缺少的內容:

  • 一個基於數據庫模式的 GraphQL API 端點
  • 一個基於 OIDC 協議的身份驗證和身份服務
  • 完整的終端用戶登錄流程和身份驗證狀態管理
  • 基於用戶身份和角色的安全 API 訪問

不是很難吧?如果你遇到任何問題,隨時加入 LogtoHasura 的 Discord 服務器,與團隊進行即時聊天。