OAuth鉴权——douban示例

本文详细介绍了使用豆瓣API时OAuth鉴权的具体步骤,包括获取RequestToken、用户授权、换取AccessToken等过程。

本文以访问的doubanoauth鉴权为例,说明与上篇“OAuth鉴权——原理”步骤相对应的具体内容。

操作前准备

douban网进行注册,申请访问doubanAPI权限并获得该客户oauth_consumer_keyoauth_consumer_secret,分别对应字符串:08317f4ef55c69f818947dece0153de8d5123fbe2351a66a

douban网提供的RequestToken URLUserAuthorization URLAccessTokenURL分别为

http://www.douban.com/service/auth/request_token

http://www.douban.com/service/auth/authorize

http://www.douban.com/service/auth/access_token

具体操作

A. 客户端(第三方软件)向doubanOAUTH服务器请求未授权的RequestToken。向http://www.douban.com/service/auth/request_token发起请求,在请求头中包含Authorization参数,参数值如下:

     Authorization ="OAuth realm=\"\",

     oauth_consumer_key=\"08317f4ef55c69f818947dece0153de8\",

     oauth_signature_method=\"HMAC-SHA1\",

     oauth_signature=\"sakzOEJkvdLuQQ147tkH96UfRUk%3D\",

     oauth_timestamp=\"1296185895\",

     oauth_nonce=\"F05FDFAE-251C-4F5C-96B8-8891E9FFA798\",

     oauth_version=\"1.0\"";

注:oauth_signature字段保存本次请的鉴名信息,用于本次用于鉴名的字符串为”http://www.douban.com/service/auth/request_token&oauth_consumer_key=08317f4ef55c69f818947dece0153de8&oauth_nonce=F05FDFAE-251C-4F5C-96B8-8891E9FFA798&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1296185895&oauth_version=1.0,用于鉴名的密匙为oauth_consumer_secretd5123fbe2351a66a

B. OAUTH服务提供商同意使用者的请求,并向其颁发未经用户授权的oauth_token与对应的oauth_token_secret,并返回给使用者;

     oauth_token=bd91a88ccc59247038b4f9a6650b6d50&oauth_token_secret=6630aaac2859a95f

C. 使用者向OAUTH服务提供商请求用户授权的RequestToken。即向UserAuthorization URL发起请求并在请求中携带上一步服务提供商颁发的未授权的token与其密钥。

    本次请求URL格式:http://www.douban.com/service/auth/authorize?oauth_token=bd91a88ccc59247038b4f9a6650b6d50&oauth_token_secret=6630aaac2859a95f

D. OAUTH服务提供商通过网页要求用户登录并引导用户完成授权

    引导页面如下:

点击登录,进入登录页面,输入用户Email及密码;登录成功后,要求用户选择是否允许第三方应用访问

点击同意,允许第三方应用操作douban数据


E. Request Token授权后,使用者将向http://www.douban.com/service/auth/access_token发起请求,将B)步骤中获得的RequestToken换取成AccessToken,同样在请求头中包含Authorization参数:

     Authorization ="OAuth realm=\"\",

     oauth_consumer_key=\"08317f4ef55c69f818947dece0153de8\",

     oauth_token=\"bd91a88ccc59247038b4f9a6650b6d50\",

     oauth_signature_method=\"HMAC-SHA1\",

     oauth_signature=\"D1FG9iv536wT75flCsd4Myf60CA%3D\",

     oauth_timestamp=\"1296185954\",

     oauth_nonce=\"C607984D-7249-4C69-B50E-3051F0FF6711\",

     oauth_version=\"1.0\"";

注:oauth_signature字段保存本次请的鉴名信息,用于本次用于鉴名的字符串为”http://www.douban.com/service/auth/access_token&oauth_consumer_key=08317f4ef55c69f818947dece0153de8&oauth_nonce=C607984D-7249-4C69-B50E-3051F0FF6711&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1296185954&oauth_token=bd91a88ccc59247038b4f9a6650b6d50&oauth_version=1.0,用于鉴名的密匙为oauth_consumer_secret6630aaac2859a95f

F. OAUTH服务提供商同意使用者的请求,并向其颁发AccessToken与对应的密钥,并返回给使用者。对于douban应用服务器还返回了douban_user_id。返回结果:oauth_token=a8368ebd03415dfdf8a3ac3709c419f7&oauth_token_secret=2b211ceab9b567f6&douban_user_id=48880757

G. 使用者以后就可以使用上步返回的AccessToken密钥访问用户授权的资源。







<think>我们正在处理用户的问题:如何在Spring AI MCP项目中集成OAuth。 根据提供的引用,我们知道之前有一篇文章讨论了使用OAuth2保护Spring AI MCP服务器,并且提到了使用独立授服务器。 引用[2]中给出了一些依赖和配置的提示。 步骤: 1. 添加必要的依赖:包括OAuth2资源服务器、授服务器以及Spring AI MCP服务器WebMVC的starter。 2. 配置授服务器(如果使用独立的授服务器)或者配置资源服务器以使用已有的授服务器。 3. 配置资源服务器,设置JWT的 issuer-uri 等属性。 由于用户想要集成OAuth,我们假设用户希望保护MCP的端点,因此我们将配置资源服务器。 具体步骤: 第一步:添加依赖 在pom.xml中添加以下依赖(如果使用Maven): - spring-boot-starter-oauth2-resource-server:用于资源服务器支持 - spring-boot-starter-oauth2-authorization-server:如果需要自己搭建授服务器(可选,如果已有独立授服务器则不需要) - spring-ai-starter-mcp-server-webmvc:Spring AI MCP服务器 第二步:配置授服务器(可选) 如果用户需要自己搭建授服务器,可以配置一个。但根据引用[1],他们更倾向于使用独立的授服务器,所以这里我们主要关注资源服务器的配置。 第三步:配置资源服务器 在application.properties或application.yml中配置资源服务器,指定jwt issuer的uri(即授服务器的地址)以及其他安全配置。 示例配置(application.yml): ```yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: http://localhost:9000 # 授服务器的地址 ``` 第四步:配置安全规则 通过配置Spring Security来保护MCP的端点。可以创建一个Security配置类。 示例代码: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .requestMatchers("/mcp/**").authenticated() // 保护MCP端点 .anyRequest().permitAll() ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> {}) ); return http.build(); } } ``` 注意:上述配置中,我们假设MCP的端点都在/mcp路径下。根据实际情况调整。 第五步:测试 启动应用,访问MCP端点应该需要提供有效的JWT令牌。 引用[1]提到他们之前使用OAuth2保护MCP服务器,并计划使用独立授服务器。因此,如果用户有独立的授服务器,确保issuer-uri指向该服务器。 生成相关问题: 1. 如何生成JWT令牌来测试Spring AI MCP的端点? 2. 如何自定义Spring Security的限规则以保护特定的MCP端点? 3. 如果使用独立的授服务器,如何配置Spring AI MCP作为资源服务器? 注意:在回答中,我们引用了提供的引用[1]和[2],在末尾添加引用标识。</think>### 在 Spring AI MCP 项目中集成 OAuth 的步骤 #### 1. **添加依赖** 在 `pom.xml` 中添加 OAuth2 资源服务器和授服务器的依赖: ```xml <dependencies> <!-- OAuth2 资源服务器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <!-- OAuth2 授服务器(可选,若使用独立服务器则无需) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId> </dependency> <!-- Spring AI MCP 核心 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId> </dependency> </dependencies> ``` #### 2. **配置资源服务器** 在 `application.yml` 中配置 JWT 验证: ```yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://your-auth-server.com # OAuth2 授服务器地址 jwk-set-uri: https://your-auth-server.com/oauth2/jwks # JWK 端点 ``` #### 3. **配置安全规则** 创建安全配置类,定义端点访问限: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authz -> authz .requestMatchers("/mcp/api/**").authenticated() // MCP 端点需 .anyRequest().permitAll() ) .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> {})); // 启用 JWT 验证 return http.build(); } } ``` #### 4. **配置授服务器(可选)** 若需内置授服务器,添加配置: ```java import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; import org.springframework.security.oauth2.server.authorization.settings.TokenSettings; import java.time.Duration; @Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient client = RegisteredClient.withId("mcp-client") .clientId("client-id") .clientSecret("{noop}client-secret") .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .scope("mcp:access") .tokenSettings(TokenSettings.builder() .accessTokenTimeToLive(Duration.ofHours(1)) .build()) .build(); return new InMemoryRegisteredClientRepository(client); } ``` #### 5. **验证集成** - 访问受保护的 MCP 端点(如 `/mcp/api/models`)时需在请求头中添加: ``` Authorization: Bearer <JWT_TOKEN> ``` - 通过 OAuth2 客户端(如 Postman)获取令牌后测试访问。 ### 关键注意事项 1. **独立授服务器**:推荐使用 Keycloak 或 Okta 等专业服务,避免自建复杂性[^1]。 2. **限粒度**:通过 `@PreAuthorize` 注解实现方法级控制,如: ```java @PreAuthorize("hasAuthority('SCOPE_mcp:admin')") public void deleteModel(String id) { ... } ``` 3. **令牌类型**:Spring Security 默认支持 JWT,若使用 Opaque Token 需额外配置 `introspection-uri`。 ### 性能优化建议 - 启用 JWT 本地签名验证(而非远程调用 JWK 端点) - 使用 Redis 缓存令牌验证结果 - 限制高频端点(如令牌校验)的访问速率 > **示例访问流程**: > 客户端 → 获取 OAuth2 令牌 → 访问 `/mcp/api` → 资源服务器验证 JWT → 授访问或返回 401 --- ### 相关问题 1. 如何为不同的 MCP API 端点设置差异化的 OAuth2 限? 2. 使用 Keycloak 作为外部授服务器时,Spring AI MCP 应如何配置? 3. OAuth2 对 Spring AI MCP 的性能影响如何评估? 4. 如何在 Spring AI MCP 中实现 JWT 令牌的自定义字段校验? [^1]: Spring AI MCP 客户端与 OAuth2 实践(1.0.0) [^2]: 实现,带有限校验的 MCP 服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值