You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:05