MCP 伺服器就像是你應用程式的一扇大門:它可以讀取使用者資料、寫入記錄、呼叫內部 API,並代表使用者觸發操作。如果這扇門沒有鎖好,那麼生產事故隨時可能發生。
這就是為什麼在使用 Laravel MCP 伺服器時,身份驗證是必不可少的。問題在於需要哪種驗證方式,以及設定它需要多少工作量(劇透:幾乎不需要)。
我們致力於讓 Laravel MCP 的身份驗證過程變得儘可能簡單。在本文中,我們將展示如何對其進行設定,並分享一些安全最佳實踐。有關 Laravel MCP 的更多資訊,請參閱這份完整指南。
為什麼你的 MCP 伺服器需要身份驗證
Laravel MCP 伺服器(或任何 MCP)會公開用於執行程式碼的工具。如果你的工具涉及使用者資料、賬單記錄或任何第三方 API,你需要在執行任何查詢之前明確是誰在呼叫它們。
如果沒有身份驗證
- 任何能夠訪問你伺服器 URL 的程序都可以呼叫你的工具。
- 不存在用於限定查詢範圍的使用者上下文。每次工具呼叫都能看到所有資料。
- 你無法對不應看到敏感工具的使用者隱藏這些工具。
- 按使用者進行速率限制是不可能的。
為本地使用而構建的 MCP 伺服器(在使用者的機器上透過 STDIO 執行)不在此列,它們預設享有信任。但一旦你的伺服器可以透過 HTTP 被 Claude Desktop、Cursor 或任何外部智慧體訪問,身份驗證就是必需的。
協議:OAuth 2.1
MCP 規範強制要求在 HTTP 傳輸中使用 OAuth 2.1。這不是 Laravel 的慣例或某個包的偏好,而是規範中固有的部分。
以下是與 MCP 相關的關鍵增強功能:
- PKCE (程式碼交換證明金鑰) 是必需的。這可以防止授權碼攔截攻擊。
- 支援 動態客戶端註冊 (RFC 7591),因此 MCP 客戶端可以自行註冊,無需你為每個客戶端手動建立憑據。
- 授權伺服器元資料 (RFC 8414) 和 受保護資源元資料 (RFC 9728) 讓客戶端能夠自動發現你的端點。
透過此協議,像 Claude Desktop 這樣的客戶端可以連線到新的 MCP 伺服器,發現其授權伺服器,完成自我註冊,並在雙方無需任何手動配置的情況下完成 OAuth 流程。
Laravel MCP 提供的支援
laravel/mcp 包實現了上述所有功能。只需呼叫一個方法,即可註冊發現、元資料和動態註冊端點。
這一行程式碼處理了原本需要數百行自定義 OAuth 伺服器程式碼才能實現的功能。該包強制執行 PKCE,處理發現元資料,並配置好動態註冊。你只需要配置你的應用,而無需自己實現協議細節。
使用 Laravel MCP 進行身份驗證的三種方式
選項 1:Laravel Passport(推薦用於外部客戶端)
Laravel Passport 實現了完整的 OAuth 2.1 流程。當第三方 MCP 客戶端需要連線到你的伺服器時,請使用此方案。這是生產環境下的正確選擇。
安裝並配置
在你的 User 模型中新增 trait 和契約
在 routes/ai.php 中註冊 OAuth 路由並保護你的伺服器
這就是全部設定。Laravel Passport 和 laravel/mcp 會處理剩下的工作。
選項 2:Laravel Sanctum(用於受控環境)
Laravel Sanctum 使用簡單的 Bearer 令牌。當你同時控制客戶端和伺服器時,請使用此方案。
為 MCP 客戶端生成令牌
客戶端在每次請求時傳送 Authorization: Bearer {token}。如果你正在構建內部工具,可以從這裡開始。當有外部客戶端接入時,再切換到 Passport。
圖片。
選項 3:自定義中介軟體
如果你有現有的身份驗證系統(如 API 金鑰、JWT 或專有令牌格式),可以將任何中介軟體傳遞給 ->middleware() 呼叫。
只要你的中介軟體能夠解析出 $request->user(),後續的所有流程都會以相同的方式工作。
為 MCP 設定 Laravel Passport

在完成上述 Passport 配置後,當客戶端連線時會發生以下情況:
- MCP 客戶端向你的伺服器傳送未經驗證的請求。
- 你的伺服器返回 HTTP 401。
- 客戶端從你的應用獲取
/.well-known/oauth-protected-resource。 - 客戶端發現授權伺服器 URL 並獲取
/.well-known/oauth-authorization-server。 - 客戶端進行動態註冊(如果尚未註冊)。
- 客戶端開啟瀏覽器訪問你的 Passport 授權端點,並攜帶 PKCE 挑戰碼。
- 你的應用向用戶顯示授權頁面。使用者選擇批准或拒絕。
- Passport 將瀏覽器重定向回 MCP 客戶端的回撥 URL,並附帶一個授權碼。
- MCP 客戶端透過
POST /oauth/token使用授權碼和程式碼驗證器換取訪問令牌(以及可選的重新整理令牌)。
- MCP 客戶端透過
- 客戶端在後續的每個請求中包含
Authorization: Bearer <token>。
所有這些都由 Passport 和 Mcp::oauthRoutes() 註冊自動處理,你無需自行實現任何這些端點。
在工具中訪問已認證的使用者
在任何 Laravel MCP 工具內部,$request->user() 都會返回已認證的 User 模型。使用它來限定資料範圍並檢查許可權。
請注意,這裡的 $request 是 Laravel\Mcp\Request,而不是 Illuminate\Http\Request。使用者訪問模式是一樣的,但類不同。
使用 shouldRegister 控制工具可見性
你可以透過覆蓋 shouldRegister 方法,完全對未經授權的使用者隱藏工具。如果返回 false,該工具將不會出現在 Laravel MCP 功能列表中。
這是 Laravel MCP 中的主要授權機制。若要在工具內部進行更精細的檢查,請使用標準的 Laravel 授權。
沒有特定於 MCP 的 Gate 或 Policy,直接使用你現有的即可。
在授權檢視中你可以做什麼
當 MCP 客戶端進行身份驗證時,Passport 會顯示授權檢視。你可以透過 php artisan vendor:publish --tag=mcp-views 釋出檢視,並在 AppServiceProvider 中覆蓋它們。
這個頁面是使用者決定是否授予訪問許可權的關鍵時刻。在該檢視中,以及在你的 MCP 伺服器的更廣泛範圍內,你可以完全使用 Laravel 的全部功能:
- 展示客戶端請求訪問的工具列表
- 顯示客戶端名稱和重定向 URI,以便使用者驗證請求的合法性
- 在批准前要求進行多因素身份驗證 (MFA)
- 記錄授權事件以供審計追蹤
- 當新客戶端連線時,透過電子郵件或 Slack 通知使用者
- 允許使用者在其賬戶設定頁面撤銷令牌
- 將授權範圍限制到特定資源(例如:僅限某個特定專案中的任務)
- 顯示符合你應用設計的品牌授權介面
安全最佳實踐
MCP 規範確定了每個生產伺服器都必須解決的四個攻擊向量。
令牌傳遞 (Token passthrough) 被規範明確禁止。永遠不要將 MCP 客戶端傳送給你的令牌轉發給下游 API。請將第三方憑據單獨儲存在你的資料庫中,並在工具處理程式中直接使用它們。傳遞令牌會破壞速率限制、審計追蹤和受眾驗證。
當使用會話代替每請求身份驗證時,會話劫持 成為可能。不要將會話用於身份驗證。請在每個請求上驗證 Bearer 令牌。如果你對任何與會話相關的事件進行了佇列處理,請使用 user_id:session_id 作為鍵,而不是單獨的會話 ID。
範圍最小化 在令牌洩露時可以減小影響範圍。laravel/mcp 宣稱的 mcp:use 範圍是有意最小化的,請保持這種狀態。永遠不要使用萬用字元範圍。
無論令牌範圍允許什麼,都要在每個工具內部使用 $request->user()->cannot(...) 來強制執行細粒度的授權。
檢視 模型上下文協議文件 以獲取更多安全最佳實踐。
構建安全的 Laravel MCP 伺服器
MCP 中的身份驗證不應是事後考慮的問題。一個會洩露其他使用者任務的工具,或者一個因為你忘記設定速率限制而不斷攻擊資料庫的智慧體迴圈,都不是小 Bug。這是隨時可能爆發的生產事故。
laravel/mcp 包處理了困難的部分。你的工作是將它們正確地連線起來,且不要破壞它提供的保護機制。
如果有疑問,請回歸到兩個最重要的問題:這是哪個使用者? ($request->user()) 以及 他們應該看到這個工具嗎? (shouldRegister)。其他所有內容都可以使用你已經熟悉的 Laravel 模式來對接。
獲取完整的 API 參考,請參閱 Laravel MCP 文件,或者克隆 Laravel Locket 演示應用,檢視完整的端到端身份驗證實現。
