OpenShift同命名空间下Spring Security对接Keycloak重定向及令牌异常问题
解决OpenShift中Spring Boot与Keycloak的重定向及令牌异常问题
问题根源
- 初始配置使用Keycloak的内部集群服务地址作为
issuer-uri,导致Spring Security向前端返回的授权重定向URL为内部不可访问地址,用户无法正常跳转登录。 - 单独修改
authorization-uri为外部域名后,Keycloak颁发的令牌中issuer字段为外部域名,但Spring Boot仍以内部issuer-uri验证令牌,两者不匹配,触发令牌验证异常。
解决方案
1. 配置Keycloak固定Issuer地址
在OpenShift的Keycloak Deployment中添加以下环境变量,强制Keycloak使用外部域名作为全局Issuer,确保内部、外部访问生成的令牌Issuer一致:
env: - name: KC_HOSTNAME value: keycloak-my-namespace.openshift.mydomain.com - name: KC_HOSTNAME_STRICT value: "true" - name: KC_PROXY value: edge
KC_HOSTNAME:指定Keycloak对外暴露的正式域名KC_HOSTNAME_STRICT:强制所有OIDC端点使用配置的域名,忽略请求的Host头KC_PROXY:适配OpenShift Edge路由的HTTPS终止场景
2. 更新Spring Boot的application.properties配置
# OAuth2客户端注册配置 spring.security.oauth2.client.registration.keycloak.client-id=my-app spring.security.oauth2.client.registration.keycloak.client-secret= spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.keycloak.scope=openid # 配置Spring Boot的外部重定向地址(根据实际路由调整) spring.security.oauth2.client.registration.keycloak.redirect-uri=https://springboot-my-namespace.openshift.mydomain.com/login/oauth2/code/keycloak # Keycloak Provider配置 # 使用与Keycloak一致的外部Issuer地址 spring.security.oauth2.client.provider.keycloak.issuer-uri=https://keycloak-my-namespace.openshift.mydomain.com/realms/my-realm # 可选:使用内部服务地址获取JWK证书,减少外部网络依赖 spring.security.oauth2.client.provider.keycloak.jwk-set-uri=http://keycloak.my-namespace.svc.cluster.local:8080/realms/my-realm/protocol/openid-connect/certs spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username
3. 验证操作
- 重启Keycloak和Spring Boot Pod,使配置生效
- 访问Spring Boot的外部地址,会正确重定向到Keycloak的外部登录页
- 登录后令牌验证通过,无异常出现
内容的提问来源于stack exchange,提问作者viceincapacitateonly
相关产品推荐
相关产品推荐

