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

Spring Boot+Angular+Keycloak容器化后iss声明不一致问题求助

解决方案

1. 正确配置Keycloak容器环境变量

新版本Keycloak(17+)基于Quarkus重构,已废弃旧的KEYCLOAK_FRONTEND_URL,改用KC_HOSTNAME系列参数来统一控制令牌生成的iss字段。启动Keycloak容器时,设置以下环境变量,确保生成的JWT令牌iss与前端访问地址一致:

docker run -d \
  --name keycloak \
  --network your-docker-network \
  -p 8082:8080 \
  -e KC_HOSTNAME=localhost \
  -e KC_HOSTNAME_PORT=8082 \
  -e KC_HOSTNAME_STRICT_HTTPS=false \
  -e KC_HTTP_ENABLED=true \
  -e KC_PROXY=edge \
  -e KEYCLOAK_ADMIN=admin \
  -e KEYCLOAK_ADMIN_PASSWORD=admin \
  quay.io/keycloak/keycloak:latest start-dev

参数说明:

  • KC_HOSTNAME=localhost:指定Keycloak对外暴露的主机名,与前端访问的主机保持一致
  • KC_HOSTNAME_PORT=8082:对应前端访问的主机映射端口
  • KC_HOSTNAME_STRICT_HTTPS=false:禁用严格HTTPS检查(适配你当前的HTTP访问场景)
  • KC_PROXY=edge:告知Keycloak运行在反向代理环境,会正确识别外部请求的地址信息
  • KC_HTTP_ENABLED=true:启用HTTP协议支持

2. 调整Spring Boot后端的Issuer配置

由于后端容器处于Docker内部网络,无法直接使用主机的localhost,需替换为容器可访问的Keycloak地址:

方案A(Docker Desktop环境)

使用Docker内置的host.docker.internal域名,它会自动映射到主机的localhost:

# application.properties
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://host.docker.internal:8082/realms/sales

方案B(通用Docker环境)

使用主机的实际IP地址(例如192.168.1.100,替换为你的主机真实IP):

# application.properties
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://192.168.1.100:8082/realms/sales

方案C(统一自定义域名)

如果不想依赖主机IP或Docker特殊域名,可在本地hosts文件添加映射:

  • Windows:C:\Windows\System32\drivers\etc\hosts
  • Linux/macOS:/etc/hosts

添加内容:

127.0.0.1 keycloak.local

然后修改Keycloak启动命令的KC_HOSTNAME参数:

docker run -d \
  --name keycloak \
  --network your-docker-network \
  -p 8082:8080 \
  -e KC_HOSTNAME=keycloak.local \
  -e KC_HOSTNAME_PORT=8082 \
  -e KC_HOSTNAME_STRICT_HTTPS=false \
  -e KC_HTTP_ENABLED=true \
  -e KC_PROXY=edge \
  -e KEYCLOAK_ADMIN=admin \
  -e KEYCLOAK_ADMIN_PASSWORD=admin \
  quay.io/keycloak/keycloak:latest start-dev

同步修改Spring Boot配置:

spring.security.oauth2.resourceserver.jwt.issuer-uri=http://keycloak.local:8082/realms/sales

这种方式下,前端、后端、Keycloak令牌的iss字段完全统一为keycloak.local:8082,彻底解决不一致问题。

3. 验证配置

  1. 确保所有容器在同一Docker网络中启动
  2. 前端访问http://localhost:8082(或keycloak.local:8082)登录Keycloak获取令牌
  3. 用JWT解码工具(如JWT.io)查看令牌的iss字段,确认与Spring Boot配置的issuer-uri一致
  4. 调用Spring Boot接口,验证令牌可正常通过认证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:05:24