Spring Security OAuth2授权服务器issuer-uri配置及暴露方法求助
解决Spring Security OAuth 2.0授权服务器与新版Spring Security资源服务器的issuer-uri配置问题
我完全懂你的处境——不少开发者都碰到过Spring Security OAuth 2.x被弃用但又得自建授权服务器的尴尬,下面给你一步步搞定issuer-uri的配置问题:
先明确:旧版Spring Security OAuth 2.0授权服务器默认没有暴露issuer元数据端点
Spring Security OAuth 2.0 2.3.4.RELEASE版本对OpenID Connect(OIDC)的支持比较基础,默认不会自动暴露标准的OIDC发现端点(/.well-known/openid-configuration),而新版Spring Security资源服务器正是通过这个端点来识别授权服务器的issuer信息的,所以我们需要手动创建这个端点。
手动配置授权服务器的issuer元数据端点
1. 定义授权服务器的issuer基础URI
先确定你的授权服务器的基础地址,比如http://localhost:8080/auth,可以把它写到配置文件或者作为常量定义在代码里。
2. 创建OIDC发现端点控制器
写一个简单的控制器,返回符合OIDC标准的元数据JSON,包含资源服务器需要的核心信息:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController public class OidcDiscoveryController { // 替换成你的授权服务器实际地址 private static final String ISSUER_BASE_URI = "http://localhost:8080/auth"; @GetMapping("/.well-known/openid-configuration") public Map<String, Object> oidcDiscoveryEndpoint() { Map<String, Object> discoveryMetadata = new HashMap<>(); // 核心issuer字段,必须和资源服务器配置的issuer-uri一致 discoveryMetadata.put("issuer", ISSUER_BASE_URI); // 授权服务器的标准端点地址 discoveryMetadata.put("authorization_endpoint", ISSUER_BASE_URI + "/oauth/authorize"); discoveryMetadata.put("token_endpoint", ISSUER_BASE_URI + "/oauth/token"); // 用于获取公钥验证JWT签名的端点 discoveryMetadata.put("jwks_uri", ISSUER_BASE_URI + "/oauth/token_key"); // 你的授权服务器支持的响应类型、授权类型,可根据实际配置调整 discoveryMetadata.put("response_types_supported", new String[]{"code", "token"}); discoveryMetadata.put("grant_types_supported", new String[]{"authorization_code", "password", "client_credentials", "refresh_token"}); return discoveryMetadata; } }
3. 放开必要端点的访问权限
确保授权服务器的OIDC发现端点、token_key端点能被资源服务器访问,在授权服务器的Spring Security配置里添加放行规则:
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() // 放开OIDC发现端点和公钥端点 .antMatchers("/.well-known/openid-configuration", "/oauth/token_key").permitAll() // 其他接口按需求配置权限 .anyRequest().authenticated(); }
配置资源服务器的issuer-uri
在新版Spring Security资源服务器的配置文件(比如application.yml)里,直接指定授权服务器的基础issuer uri即可:
spring: security: oauth2: resourceserver: jwt: issuer-uri: http://localhost:8080/auth
资源服务器会自动请求{issuer-uri}/.well-known/openid-configuration获取元数据,进而验证JWT的合法性。
额外注意事项
- 如果你的授权服务器使用JWT令牌(而非默认的不透明令牌),要确保已经配置了
JwtAccessTokenConverter,这样/oauth/token_key端点才会返回有效的公钥。 - 确保授权服务器和资源服务器的网络能互通,避免因跨域或防火墙导致端点访问失败。
内容的提问来源于stack exchange,提问作者Julez
相关产品推荐
相关产品推荐

