使用 Logto 在 Netlify 上的全端認證解決方案:保護 web 應用程式和無伺服器函數
展示如何利用 Logto 認證來保護 Netlify 的 web 應用程式和無伺服器函數,並附有源代碼範例與線上預覽展示。
Netlify 是一個強大的平台,用於部署和託管現代 web 專案,提供無縫的 Git 整合、自動化構建和無伺服器函數,適合快速和可擴展的開發工作流程。
在這份全面指南中,你將學到如何:
- 使用 Logto 在 Netlify 上為單頁應用程式 (SPA) 實作認證,並用 Vite + React 範例演示
- 使用 Logto 認證保護你的 Netlify 無伺服器函數
- 使用我們的參考實作來部署一個可投入生產的應用程式:example-vite-react-logto
查看線上預覽展示。
先決條件
在開始本教程之前,你需要設定以下事物:
使用 Vite 創建 React 應用程式
按照 Vite 的 入門指南 創建一個 React 應用程式。
根據創建指導來選擇你想要的技術棧。在本文中,我們將選擇 React + TypeScript。
然後進入專案根目錄,根據指南安裝相依性,並運行應用程式。
使用 Netlify 部署應用程式
按照 Get started with Netlify 指南部署你的應用程式。
一旦你完成部署,就可以在 https://<your-site-name>.netlify.app
查看線上站點。
記下此 URL,因為我們稍後將需要配置 Logto。
將 Logto 整合到你的應用程式中
要開始使用 Logto 認證:
- 導航至 Logto 控制台的「應用程式」頁面
- 創建一個新的應用程式
- 選擇你的前端框架(在我們的例子中是 React)
- 注意:你可以根據需要創建任何單頁應用程式(SPA)或原生應用程式
- 按照集成指南來自:
- Logto 控制台的內建指南,或
- 官方 React 認證集成指南
- 從應用程式詳情頁中,記下:
- 你的應用程式 ID
- Logto 端點(可以在「端點和憑據」部分找到,通常格式為
https://<your-instance>.logto.app/
) 這些憑據將在後續步驟中需要。
注意在我們的演示中,我們使用 /callback 路由來處理 Logto 的登錄重定向。在 Logto 中需要配置的重定向 URIs 為 https://<your-site-name>.netlify.app/callback
。
在用戶登出後,我們返回到主頁,所以我們將登出後重定向 URIs 設置為 https://<your-site-name>.netlify.app
。
然後在 Netlify 的環境變數中設置我們創建的 Logto 應用程式的信息(你的網站 -> 網站配置 -> 環境變數):
然後我們在前端專案中使用這些配置:
你可以在這裡查看最終的整合代碼:example-vite-react-logto。
注意當我們部署到 Netlify 並通過 Logto 登錄時,我們的 URL 並不會自動重定向到 Callback 頁面。這是因為 Netlify 預設不支持單頁應用程式 (SPA) 的客戶端路由。
當你訪問類似 /callback
的路徑時,Netlify 將嘗試在伺服器上查找相應的文件,而不是將請求轉發到你的 React 應用程式。
此時,我們需要在 Netlify 專案的 public 目錄中創建一個 _redirects
文件,告訴 Netlify 將所有請求重定向到你的 index.html:
或者,你可以在專案根目錄中創建一個 netlify.toml 文件:
現在,我們的路由應該可以正常工作了。
使用 Netlify 函數創建後端 APIs
Netlify 函數提供了一種簡單而強大的方式來構建後端 APIs。使用 Netlify 函數,我們可以編寫伺服器端邏輯,而無需擔心傳統的伺服器配置和維護。
這些函數是版本控制的,與你的網站一起構建和部署,使前端和後端的開發和部署過程無縫銜接。
讓我們開始使用 Netlify 函數來構建我們的後端 APIs。
首先,我們需要在專案的 netlify 目錄下創建一個 functions 目錄,然後創建一個 hello.ts 文件:
當我們訪問 https://<your-site-name>.netlify.app/.netlify/functions/hello
,此函數將被調用並返回 "Hello world!"。
如果你覺得路徑 /.netlify/functions/hello
看起來有點奇怪,可以在 public/_redirects 文件中設置一個重定向規則來調用該函數:
這樣,當我們訪問 https://<your-site-name>.netlify.app/api/hello
時,將調用我們的函數並返回 "Hello world!"。這實際上是使用 Netlify 函數構建 APIs 的常見方式。
我們可以在前端項目中使用 fetch 訪問此 API:
使用 Logto 保護你的 Netlify 函數
既然我們已經有了一個後端 API,我們需要確保只有經驗證的用戶可以訪問它。我們將使用 Logto 的認證機制來保 護我們的 Netlify 函數。
要保護我們的 API 端點:
- 在 Logto 控制台中創建一個 API 資源來表示我們的後端 API:
- 前往 Logto 控制台的 "API 資源",並創建一個新 API
- 設置一個名稱和 API 識別符(例如,
https://api.backend.com
) - 記下 API 資源詳情頁面的 API 識別符,因為我們稍後會需要它
- 將這個 API 資源添加到你的應用程式配置中,並在 Netlify 的環境變數中添加識別符:
- 更新 Logto 配置以包含這個 API 資源:
- 當訪問受保護的端點時,你的前端需要包含一個有效的存取令牌。以下是請求和使用它的方法:
現在,我們在後端中實作令牌驗證,以確保只有帶有有效存取令牌的請求才會被處理。
首先,我們需要安裝 jose
相依性來幫助我們驗證 JWT 令牌:
然後,我們可以在後端中實作令牌驗證:
現在,讓我們更新 Netlify 函數以使用 verifyLogtoToken
函數:
就是這樣!現在,我們的 Netlify 函數已被 Logto 保護,只有帶有有效存取令牌的請求才會被處理。
測試我們的演示
現在,將你的應用程式部署到 Netlify,然後進行測試!你可以參考這裡的線上預覽展示。
- 造訪線上網站
https://<your-site-name>.netlify.app
- 點擊導航欄中的「登入」按鈕
- 使用 Logto 用戶帳戶登入,你會看到你已登入。
- 點擊導航欄中的「受保護資源」標籤,你將被重定向到受保護頁面。
- 點擊「查看受保護資源」按鈕,你將看到來自
api/hello
端點的響應數據。 - 點擊導航欄中的「登出」按鈕,你將被重定向到主頁。
結論
這份指南展示了如何將 Logto 認證整合到部署在 Netlify 的 web 應用程式中。
通過配置 Logto 應用程式和 API 資源,我們實施了前端認證並保護了 Netlify 函數端點。
為了更細緻的訪問控制,你可以利用 Logto 的 RBAC(基於角色的訪問控制) 功能,通過在 Logto 控制台中定義角色和權限,並在 Netlify 函數中驗證用戶角色實現。