繁體中文(香港)
  • nextjs
  • app-router
  • server-actions
  • sdk

使用 Server Actions 將 Logto 認證添加到你的 Next.js 應用程式中

使用 Server Actions 將 Logto 認證整合到你的 Next.js 應用程式中。

Sijie
Sijie
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

Server Actions 提供了一種全新的方法來創建穩健的 web 應用程式,無需傳統的 REST API。我們之前已在 我們的文章 中討論過這個。

今天,我們很高興宣佈在我們的 Next.js SDK 中正式支援 Server Actions,儘管它是一個實驗特性。

想快速了解,請查看 此範例,並在本指南中詳細說明如何將 Logto 與 Server Actions 整合。

先決條件

要開始,請確保你擁有以下資源:

  • 一個運行中的 Logto 實例或訪問 Logto Cloud 帳戶的權限。
  • 一個啟用了 Server Actions 特性的 Next.js 專案。

配置 Logto

如果你是自托管 Logto,請參考 Logto 的「入門」文檔以設置你的 Logto 實例。

如果你使用 Logto Cloud,請輸入 URL https://cloud.logto.io/ 打開 Logto 控制台,或者輸入你設置自托管的端點。

接下來,導航至「應用程式」選項卡,並點擊「建立應用程式」。

Applications tab

在彈出窗口中,選擇「Next.js (App Router)」,然後提供一個應用程式名稱,例如「Next.js App」,然後點擊「建立應用程式」。

Create application

你將被引導到 Logto 的教學頁面。點擊「完成並結束」以繼續到應用程式詳細信息頁面。

Applications details

在「重定向 URI」部分,輸入以下值:

例如,如果你的 Next.js 託管在 http://localhost:3000,則該值應為:

Save changes

點擊底部的「保存更改」按鈕。成功後,保持此頁面打開,因為它對於 Next.js 配置會有幫助。

設置 Next.js 應用程式

確保你擁有一個安裝了最新版本的 Next.js 專案。如果還沒有,你可以遵循 官方安裝指南 來創建一個專案。

在撰寫本指南時,該特性是實驗性的,需要在 next.config.js 中啟用:

定義 Logto 庫

首先,使用 npm 安裝 @logto/next 模組,如下所示:

你也可以使用 yarnpnpm

然後讓我們來創建一些「server actions」函數,新建一個文件 libraries/logto.ts

在此文件中,我們導出四個用於身份驗證目的的函數。注意第一行,"use server" 指示文件中的代碼只能在服務器端運行。我們使用 "next/headers" 來管理基於 Cookie 的會話。

我們導出的上述函數可以直接從客戶端的 React 組件中調用,這就是使用 Server Actions 的主要優勢。讓我們到下一章看看如何使用這些函數。

實現登入和登出按鈕

有了身份驗證函數後,讓我們開始構建頁面。我們將創建兩個客戶端組件來啟動登入和登出行為。

登入

/app/sign-in.tsx

這裡我們從上一章定義的 signIn 函數進行導入。儘管代碼在服務器端執行,但在用戶點擊登入按鈕時,<button> 組件仍然可以直接調用此函數。通過這樣做,我們避免了撰寫任何處理登入過程的 REST API 的需求。事實上,Next.js 已經為我們處理了"POST"請求的分發細節。在接收到 redirectUrl 後,我們可以調用 router.push 將用戶重定向到 Logto 登入頁面。

登出

/app/sign-out.tsx

登出過程與登入過程相似。

準備一個回調頁面

作為標準的 OIDC 身份提供者,Logto 在身份驗證後會將用戶重定向到一個回調 URL。因此,我們必須準備一個回調頁面來處理登入結果。

/app/callback/page.tsx

這裡我們使用 useEffect 客戶端組件,讓它更方便地顯示一個"加載中"頁面,以提高用戶體驗。

顯示用戶上下文和安全頁面

現在,讓我們製作一個簡約的主頁,以展示 Logto SDK 的功能。如有需要,通過檢查 isAuthenticated 值來保護來自未知用戶的任何資源,並重定向至登入頁面或顯示錯誤消息。

app/page.tsx

正如你所看到的,這是一個 server component,它免去了 useEffect 和管理複雜狀態更改的需求。

結論

與依賴 REST API 的傳統 Next.js 應用程式相比,伺服器操作提供了一種簡化且直接的方式來實現身份驗證。

完整的代碼範例可以在此處找到:https://github.com/logto-io/js/tree/master/packages/next-server-actions-sample

為何不嘗試使用 Logto Cloud,體驗一下這樣的便捷呢?