在Spring OAuth2资源服务器中忽略无效的签发者
我有一个在Docker堆栈中搭建的应用,包含Nginx服务器、一个Spring后端和一个Keycloak认证服务器,我在本地用于开发。Nginx服务器将所有请求代理到 /auth 给Keycloak,因此Keycloak签发的令牌的颁发者URL是 http://localhost/auth/realms/main。
如果我尝试使用Spring的 localhost URL来获取OAuth2配置,由于它只在自己的容器内查找,解析就不会成功。如果我把 spring.security.oauth2.resourceserver.jwt.issuer-uri 属性设置为Keycloak的内部Docker地址,它会加载配置,但随后会立即拒绝令牌,因为它期望颁发者是内部地址,而不是localhost。
一旦我将其部署到有正确URL的机器上,问题就会消失,因为我可以将该URL同时用于颁发者以及.well-known配置等。然而在本地工作时,是否有办法绕过Spring对颁发者URI的校验?
解决方案
这是内部网络常见的问题。资源服务器需要连接Keycloak的 JWKS URI以获取用于令牌签名的公钥。
最有效且可预测的做法是为JWKS URI使用内部URL,如下所示:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://login.demo.example/
jwk-set-uri: http://keycloak-internal/.well-known/jwks.json
如果你只配置 issuer-uri,那么就会进行元数据查找以获取JWKS URI,而这往往会返回外部URL,这也解释了你的问题。我认为上述这类改动可以解决你的问题。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。