如何使用wso2_identity_server1生成的Token访问wso2_identity_server2注册的API
跨WSO2 Identity Server的OAuth2访问方案实现
没问题,我来帮你一步步实现这个跨WSO2 Identity Server的OAuth2场景,分为两个核心阶段来操作:
阶段1:从WSO2 Identity Server 1(IS1)为User1获取Access Token
首先得确保IS1里已经存在User1,并且配置好对应的Service Provider 1(SP1):
1. 配置IS1中的Service Provider 1
- 登录IS1的管理控制台,进入Service Providers > Add,创建SP1
- 在Inbound Authentication Configuration > OAuth2/OpenID Connect Configuration下,点击Configure
- 勾选你需要的授权类型(比如密码模式适合快速测试,生产环境推荐授权码模式),设置回调URL(测试可以填任意有效URL)
- 保存后,记录下生成的
Client ID和Client Secret
2. 获取Access Token
用curl命令发起请求(替换占位符为你的实际信息):
curl -k -d "grant_type=password&username=User1&password=User1的密码&client_id=SP1_CLIENT_ID&client_secret=SP1_CLIENT_SECRET" -H "Content-Type: application/x-www-form-urlencoded" https://IS1_HOST:IS1_PORT/oauth2/token
说明:
-k参数用于忽略自签名SSL证书的验证,生产环境请移除并配置信任证书
请求成功后,你会拿到包含access_token的JSON响应,把这个token保存好。
阶段2:用IS1颁发的Token访问IS2中注册的SP2的Spring Boot API
这一步的核心是让IS2信任IS1颁发的Token,同时配置Spring Boot API作为资源服务器验证Token。
1. 在IS2中配置信任IS1作为身份提供者
- 登录IS2的管理控制台,进入Identity Providers > Add,创建一个新的身份提供者(比如命名为
IS1_IDP) - 选择OpenID Connect作为身份提供者类型,填写IS1的OIDC发现端点:
https://IS1_HOST:IS1_PORT/oauth2/oidcdiscovery - 点击Discover按钮,自动填充其他端点信息,保存配置
- 进入Service Providers > List,找到SP2,在Local & Outbound Authentication Configuration下,设置Authentication Type为
Federated Authentication,选择刚才创建的IS1_IDP作为默认身份提供者
2. 配置Spring Boot API作为资源服务器
第一步:添加依赖
在pom.xml中添加Spring Security OAuth2资源服务器依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
第二步:配置Token验证
根据你的需求选择两种验证方式之一:
方式A:基于JWT签名验证(推荐,无需额外调用IS1)
在application.yml中配置:
spring: security: oauth2: resourceserver: jwt: issuer-uri: https://IS1_HOST:IS1_PORT/oauth2/token jwk-set-uri: https://IS1_HOST:IS1_PORT/oauth2/jwks
说明:这里通过IS1的JWKS端点获取公钥,直接验证JWT的签名和有效性
方式B:基于Token introspection(调用IS1验证Token)
在application.yml中配置:
spring: security: oauth2: resourceserver: opaque: introspection-uri: https://IS1_HOST:IS1_PORT/oauth2/introspect client-id: SP1_CLIENT_ID client-secret: SP1_CLIENT_SECRET
说明:每次请求都会调用IS1的introspect端点验证Token状态,适合需要实时校验Token有效性的场景
第三步:保护API端点
在Spring Boot控制器中添加权限控制:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.security.access.prepost.PreAuthorize; @RestController @RequestMapping("/api") public class ProtectedApiController { @GetMapping("/data") @PreAuthorize("isAuthenticated()") public String getProtectedData() { return "Success: Access granted with IS1 token!"; } }
3. 测试API访问
用之前拿到的access_token发起请求:
curl -k -H "Authorization: Bearer YOUR_ACCESS_TOKEN_FROM_IS1" https://SPRING_BOOT_API_HOST:PORT/api/data
如果配置正确,你会收到API返回的成功响应。
注意事项
- 确保IS1和IS2之间网络连通,所有配置的端点都能互相访问
- 生产环境请使用正式SSL证书,避免使用
-k参数 - 若需要权限控制,可以在IS1中为User1分配角色,然后在IS2中映射该角色到SP2的权限,或者在Spring Boot中通过
@PreAuthorize("hasAuthority('ROLE_XXX')")配置细粒度权限
内容的提问来源于stack exchange,提问作者RAHUL DEEP
相关产品推荐
相关产品推荐

