Skip to main content

什麼是 Sanctum

Laravel Sanctum 是為 SPA(單頁應用程式)、行動應用程式與簡潔 API 而設計的輕量認證套件。無需複雜的 OAuth 知識,即可為每位使用者發放並管理多個 API token。 Sanctum 解決兩個問題:
自家 SPA 呼叫 API 時使用 SPA 認證。行動應用或第三方使用 API 時使用 API token 認證。也可以只使用其中一種。

與 Passport 的分工

若需對外部服務作為 OAuth2 provider,請選 Passport;但多數應用程式 Sanctum 就足夠。

安裝與設定

安裝

只要執行 install:api Artisan 指令即可設定 Sanctum。
此指令會自動執行以下事項:
  • 安裝 laravel/sanctum 套件
  • 發布 personal_access_tokens 資料表的 migration 檔
  • 執行 migration

加入 HasApiTokens trait

User model 加入 HasApiTokens trait。
如此即可使用 $user->createToken()$user->tokens 等方法。

API Token 認證

Token 流程

發行 Token

createToken() 方法發行 token。從 plainTextToken 屬性取得明文 token 值。明文 token 不會保存到資料庫,因此發行後必須立即回傳給使用者。
資料庫中儲存的是以 SHA-256 雜湊後的 token。

設定 Scope(Ability)

為 token 賦予 ability(scope),可限制該 token 能執行的操作。
處理請求時,檢查 token 的 scope。

以 Middleware 檢查 scope

bootstrap/app.php 註冊 middleware 別名:
在路由套用 middleware。

Token 的有效期限

預設 Sanctum token 無有效期限。可透過 config/sanctum.phpexpiration 選項設定以分鐘為單位的有效期限。
也可個別為每個 token 指定有效期限。
若有設定有效期限,請安排定期刪除過期 token 的排程。

使 Token 失效


SPA 認證

SPA 認證使用 session Cookie,不需要發行或管理 token。適合自家前端(Vue、React、Next.js 等)呼叫 API 的情境。
使用 SPA 認證時,SPA 與 API 需共用相同的 top-level domain(子網域可以不同)。此外,請求必須包含 Accept: application/json header 以及 RefererOrigin header。

啟用 Sanctum middleware

bootstrap/app.php 啟用 statefulApi() middleware。

設定第一方網域

config/sanctum.phpstateful 選項設定 SPA 的網域。

設定 CORS

若從其他子網域呼叫 API,需要設定 CORS。
config/cors.phpsupports_credentials 設為 true
前端的 axios 也需要設定。
Session Cookie 的網域設定也不可忘。

來自 SPA 的認證流程

1

取得 CSRF cookie

在登入前呼叫 /sanctum/csrf-cookie 端點初始化 CSRF 保護。
2

送出登入請求

/login 端點送出 POST 請求。
3

送出已認證的請求

登入後的請求會自動以 session Cookie 認證。

保護已認證的路由

auth:sanctum middleware 套用於路由,未認證的請求會收到 401 Unauthorized。API token 認證與 SPA 認證都可由這一個 middleware 處理。

實用範例:登入 API 與 token 回傳

以下是為行動應用實作 API token 認證的範例。
1

建立登入端點

2

建立已認證路由

3

從用戶端送出請求


測試

在 Sanctum 的測試中,使用 Sanctum::actingAs() 認證使用者並指定授予的 ability。

總結

在 User model 加入 HasApiTokens trait:
  • API token 認證:行動應用、第三方、CLI 工具等從沒有 session 的用戶端使用時。
  • SPA 認證:自家 Vue/React/Next.js 前端等,從相同網域(或子網域)上的 SPA 使用時。更安全且無需管理 token。
最後修改於 2026年8月2日