什麼是 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 不會保存到資料庫,因此發行後必須立即回傳給使用者。
設定 Scope(Ability)
為 token 賦予 ability(scope),可限制該 token 能執行的操作。以 Middleware 檢查 scope
在bootstrap/app.php 註冊 middleware 別名:
Token 的有效期限
預設 Sanctum token 無有效期限。可透過config/sanctum.php 的 expiration 選項設定以分鐘為單位的有效期限。
使 Token 失效
SPA 認證
SPA 認證使用 session Cookie,不需要發行或管理 token。適合自家前端(Vue、React、Next.js 等)呼叫 API 的情境。啟用 Sanctum middleware
在bootstrap/app.php 啟用 statefulApi() middleware。
設定第一方網域
在config/sanctum.php 的 stateful 選項設定 SPA 的網域。
設定 CORS
若從其他子網域呼叫 API,需要設定 CORS。config/cors.php 將 supports_credentials 設為 true。
來自 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。
- Pest
- PHPUnit
總結
安裝步驟確認
安裝步驟確認
HasApiTokens trait:常用 API 總覽
常用 API 總覽
API token 認證 vs SPA 認證選擇
API token 認證 vs SPA 認證選擇
- API token 認證:行動應用、第三方、CLI 工具等從沒有 session 的用戶端使用時。
- SPA 認證:自家 Vue/React/Next.js 前端等,從相同網域(或子網域)上的 SPA 使用時。更安全且無需管理 token。