我在 Spring Boot 微服务上遇到了有关 Spring Security 中令牌解密部分的问题。基本上会出现以下问题: 当在 @AuthenticationPrincipal Jwt jwt 上调用 getSubject() 方法时,会发生以下错误
原因:java.lang.IllegalStateException:配置中提供的颁发者“https://ids-for-spid.aqp.it:443/oauth2/token”与请求的颁发者“https://clidens1”不匹配.aqp.it:9443/oauth2/token"
我猜这是由于以下情况造成的:在众所周知的文件中,有一个发行者的网址库与传递给库的网址库不同(我猜是因为有代理或网关),我该如何解决以下问题?
具体来说,访问众所周知的文件的url如下https://clidens1.aqp.it:9443/oauth2/token/.well-known/openid-configuration 编辑后,里面有以下发行者https://ids-for-spid.aqp.it/oauth2/token,它与我唯一可访问的基本网址 clidens1.aqp.it 不同。
在 JWT 验证期间,将根据 conf 中的颁发者 URI 检查令牌
iss
声明。它必须完全匹配(即使尾部斜杠也很重要,如果有的话)。
对于令牌验证,还需要授权服务器公钥。它是使用 JWK-set URI 获取的,通常在 OIDC 配置中找到,它本身通常可以从从
iss
声明值推导出的位置获得。
您应该配置您的授权服务器以用作
iss
声明其他服务可访问的 URI。
在Keycloak设置中
hostname
配置属性可以解决您的问题,但您显然正在使用另一个授权服务器。