領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多Spring AI 支援模型上下文協議(簡稱 MCP),它允許 AI 模型以結構化的方式與外部工具和資源進行互動和訪問。透過 Spring AI,開發者只需幾行程式碼即可建立自己的 MCP 伺服器並向 AI 模型公開功能。
MCP 伺服器可以本地執行,使用 STDIO 傳輸。要將 MCP 伺服器暴露給外部世界,它必須暴露一些標準的 HTTP 端點。雖然私下使用的 MCP 伺服器可能不需要嚴格的身份驗證,但企業部署需要強大的安全性和許可權管理來處理暴露的端點。在上週釋出的最新版本 MCP 規範(2025-03-26)中解決了這一挑戰。它為客戶端和伺服器之間安全通訊奠定了基礎,利用了廣泛使用的OAuth2 框架。
雖然我們不會在這篇博文中對 OAuth2 進行全面回顧,但快速複習可能會有所幫助。在規範草案中,MCP 伺服器既是資源伺服器又是授權伺服器。
作為資源伺服器,它透過檢查 Authorization 頭對傳入請求執行授權檢查。該頭必須包含 OAuth2 access_token,這是一個表示客戶端“許可權”的字串。該令牌可以是 JSON Web Token(JWT),也可以是不攜帶任何資訊的不透明字串。如果令牌缺失或無效(格式錯誤、已過期、收件人錯誤等),資源伺服器將拒絕請求。使用這些令牌,典型的請求可能如下所示:
curl https://mcp.example.com/sse
-H "Authorization: Bearer <a valid access token>"
作為授權伺服器,MCP 伺服器還必須能夠以安全的方式為客戶端頒發 access_token。在頒發令牌之前,伺服器將驗證客戶端的憑據,並在某些情況下驗證嘗試訪問伺服器的使用者身份。授權伺服器將決定令牌的特徵:其有效期、範圍、預期受眾等。
使用 Spring Security 和 Spring Authorization Server,我們可以輕鬆地將這兩種功能新增到現有的 Spring MCP 伺服器中。

在此示例中,我們將向一個示例 MCP 伺服器新增 OAuth 2 支援——來自我們 Spring AI 示例儲存庫的“天氣”MCP 工具。我們不會探討互動的客戶端部分,只確保我們的伺服器可以頒發和驗證令牌。
首先,我們在 pom.xml 中匯入所需的 Boot starters
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>
然後,我們在 application.properties 中配置一個 OAuth2 客戶端,以便我們可以請求訪問令牌
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-id=mcp-client
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-secret={noop}secret
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-authentication-methods=client_secret_basic
spring.security.oauth2.authorizationserver.client.oidc-client.registration.authorization-grant-types=client_credentials
這是最簡單的客戶端。我們可以透過發出 POST 請求直接與授權伺服器互動,無需瀏覽器,並使用硬編碼憑據 mcp-client / secret。
最後一步是啟用授權伺服器和資源伺服器功能。我們透過為我們的安全功能建立一個配置類來實現,例如 SecurityConfiguration,其中我們公開一個 SecurityFilterChain bean
import static org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer.authorizationServer;
@Configuration
@EnableWebSecurity
class SecurityConfiguration {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.with(authorizationServer(), Customizer.withDefaults())
.oauth2ResourceServer(resource -> resource.jwt(Customizer.withDefaults()))
.csrf(CsrfConfigurer::disable)
.cors(Customizer.withDefaults())
.build();
}
}
此過濾器鏈將執行多項操作
access_token 的請求。有了這個,我們的應用程式就安全了,並且只接受帶有訪問令牌的請求。否則,請求將被拒絕,並顯示 HTTP 401 Unauthorized 錯誤。例如
curl https://:8080/sse --fail-with-body
#
# Response:
#
# curl: (22) The requested URL returned error: 401
要使用我們的 MCP 伺服器,我們首先需要獲取一個訪問令牌。我們使用 client_credentials OAuth2 授權型別,它用於“機器到機器”或“服務賬戶”場景
curl -XPOST https://:8080/oauth2/token --data grant_type=client_credentials --user mcp-client:secret
#
# Response:
#
# {"access_token":"<YOUR-ACCESS-TOKEN>","token_type":"Bearer","expires_in":299}%
複製 access_token 的值。它以字母“ey”開頭。我們現在可以使用此訪問令牌發出請求,並且它們應該會成功。例如,使用 curl,您可以將 YOUR_ACCESS_TOKEN 替換為您上面複製的值
curl https://:8080/sse -H"Authorization: Bearer YOUR_ACCESS_TOKEN"
#
# Response:
#
# id:918d5ebe-9ae5-4b04-aae8-c1ff8cdbb6e0
# event:endpoint
# data:/mcp/message?sessionId=918d5ebe-9ae5-4b04-aae8-c1ff8cdbb6e0
自版本 0.6.0 起,也可以直接在 MCP 檢查器中使用訪問令牌。只需啟動檢查器,然後將訪問令牌貼上到左側選單上的“Authentication > Bearer”欄位中。然後單擊“連線”:您應該能夠進行 MCP 呼叫。

如果您想自己執行此示例,可以在 spring-ai-examples 倉庫中檢視示例程式碼。
在此示例中,我們已經在 MCP 伺服器中實現了基礎的 OAuth2 功能。
下一步顯然是更新 MCP 客戶端,使其能夠與伺服器進行身份驗證,並使用“授權碼”OAuth2 授權。透過這種流程,使用者可以使用自己的憑據登入,並獲取繫結到使用者的令牌,從而實現更細粒度的許可權,例如使用基於角色的訪問控制(RBAC)。
我們還將探討使用外部 OAuth2 授權伺服器來頒發令牌,而只在我們的 MCP 伺服器中實現資源伺服器功能。