Spring Boot资源服务器解码JWT无法获取远程JWK集404错误如何解决
问题排查与解决步骤
- 第一步:修正JWK Set URI地址
你当前配置的jwk-set-uri大概率是错误的:/.well-known/openid-configuration本身是OAuth2授权服务器的元数据接口,不是JWK集的父路径。你可以先直接在浏览器访问你配置的地址http://localhost:8083/.well-known/openid-configuration/jwks,如果返回404,说明地址有误。
正确操作:先访问授权服务器元数据地址http://localhost:8083/.well-known/openid-configuration,找到返回JSON中的jwks_uri字段值,将其替换到yml配置的jwk-set-uri即可。
常见授权服务器默认JWK地址参考:- Spring Authorization Server默认:
http://授权服务器地址/oauth2/jwks - Keycloak默认:
http://授权服务器地址/realms/你的领域名/protocol/openid-connect/certs
- Spring Authorization Server默认:
- 第二步:检查网络连通性
确认授权服务器已经在8083端口正常启动,且资源服务器所在机器可以正常访问该地址,没有防火墙、反向代理、请求拦截规则限制访问。如果授权服务器配置了上下文路径(比如server.servlet.context-path=/auth),需要在JWK地址前补充上下文路径前缀。 - 第三步:解决依赖版本冲突
你当前引入的spring-security-oauth2-autoconfigure版本为2.1.6.RELEASE,属于早已停止维护的旧版OAuth2自动配置依赖,和你使用的5.5.3版本Spring Security核心包、新版spring-boot-starter-oauth2-resource-server依赖存在版本冲突,直接删除该依赖即可:<!-- 移除该冗余依赖 --> <!-- <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.1.6.RELEASE</version> </dependency> --> - 第四步:修正Security配置匹配顺序
你当前的权限规则配置顺序错误,Spring Security会按配置顺序优先匹配靠前的规则,anyRequest().permitAll()写在前面会导致后面的api/**认证规则完全不生效,调整顺序如下:@Override protected void configure(HttpSecurity http) throws Exception { http .sessionManagement() .sessionCreationPolicy(STATELESS) .and() .authorizeRequests() // 窄范围规则写在前 .antMatchers("api/**") .authenticated() // 全范围规则写在后 .anyRequest() .permitAll() .and() .oauth2ResourceServer() .jwt(); }
内容的提问来源于stack exchange,提问作者Hayk Mkhitaryan
相关产品推荐
相关产品推荐

