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

Spring Boot集成Keycloak无法获取JWK集报404错误求助

问题分析与解决方案

1. 确认Keycloak JWK Set URI格式正确性

Keycloak的JWK Set标准格式为:http://<keycloak服务地址>:<端口>/realms/<Realm名称>/protocol/openid-connect/certs

  • 检查配置的jwk-set-uri是否严格匹配该格式,重点核对Realm名称拼写是否准确
  • 若使用Docker部署,Spring Boot容器内部需用Docker服务名访问Keycloak,而非localhost(容器内localhost指向自身)。例如Docker Compose中Keycloak服务名为keycloak,则URI应为http://keycloak:8080/realms/xxx/protocol/openid-connect/certs

2. 简化配置:通过issuer-uri自动推导JWK地址

Spring Security OAuth2 Resource Server支持通过issuer-uri自动发现JWK Set URI,无需手动配置jwk-set-uri,避免人为错误。修改application.yml:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://<keycloak服务名>:8080/realms/<你的Realm名称>

Spring会自动调用${issuer-uri}/.well-known/openid-configuration获取OpenID配置,进而自动定位JWK Set地址。

3. 检查Docker Compose网络与服务配置

  • 确保Spring Boot应用与Keycloak处于同一Docker网络,否则容器间无法互相访问
  • 核对Docker Compose中Keycloak的服务名、端口映射是否与Spring配置一致,示例片段:
services:
  keycloak:
    image: quay.io/keycloak/keycloak:24.0.1
    command: start-dev
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    ports:
      - "8080:8080"
    networks:
      - app-network

  spring-app:
    build: .
    ports:
      - "8081:8081"
    environment:
      SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: http://keycloak:8080/realms/my-realm
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

4. 验证Keycloak Realm状态

  • 登录Keycloak控制台(http://localhost:8080/admin),确认目标Realm已创建且处于启用状态
  • 检查Realm的OpenID Connect配置,确保客户端的Access Type设置为confidential或public(匹配你的客户端类型)

5. 容器内测试JWK URI可达性

进入Spring Boot容器内部,执行curl命令测试Keycloak的JWK地址:

docker exec -it <Spring应用容器名> curl http://keycloak:8080/realms/<Realm名称>/protocol/openid-connect/certs
  • 返回404:说明URI错误或Realm未正确创建
  • 返回正常JWK JSON:说明网络连通,问题出在Spring配置环节

6. 核对Spring Security依赖

确保项目依赖中包含正确的OAuth2 Resource Server Starter:
Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'

内容的提问来源于stack exchange,提问作者yasminenebti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:17