Docker Compose内部网络访问Keycloak返回401,使用外部地址正常
问题根因
该错误的核心是JWT令牌的签发者(iss)校验不通过:
- 前端申请访问令牌时使用的是Keycloak的外部访问地址
https://202.97.95.108:8443,所以Keycloak签发的JWT令牌中iss(签发者)字段值就是这个外部地址 - 后端用内部域名
http://keycloak:8080请求userinfo接口时,Keycloak会校验令牌的iss字段是否和当前服务的访问地址匹配,二者不一致就会直接返回401未授权错误。
可行解决方案
方案1:配置Keycloak固定签发地址(最推荐)
直接指定Keycloak全局统一的前端访问地址,不管请求来自内网还是公网,令牌签发和校验都使用统一的iss值,不需要修改业务代码。
修改docker-compose.yml中keycloak服务的environment配置,新增以下参数:
- KEYCLOAK_FRONTEND_URL=https://202.97.95.108:8443/auth
配置完成后重启Keycloak服务即可,后续不管用内部域名还是外部地址访问Keycloak接口,令牌校验都可以正常通过。
方案2:配置内网域名别名,内网请求走内部网络
如果不想修改Keycloak配置,也可以让后端服务使用原本正常工作的外部地址请求Keycloak,同时让该地址在Docker内网直接解析到Keycloak容器,不需要绕公网。
修改docker-compose.yml中keycloak服务的网络配置,添加内网别名:
keycloak: # 其余原有配置保持不变 networks: intranet: aliases: - 202.97.95.108
配置后同一intranet网络下的服务访问202.97.95.108时,会直接解析到Keycloak容器的内网IP,既不需要修改后端代码,也能提升内网调用效率。
方案3:关闭签发者校验(仅测试环境可用,不推荐生产使用)
如果是临时测试场景,也可以登录Keycloak管理后台,进入对应Realm的「令牌」配置页,关闭「颁发者验证」开关。该方案会降低安全性,生产环境禁止使用。
内容的提问来源于stack exchange,提问作者Tuff
相关产品推荐
相关产品推荐

