我已经使用Spring Cloud gateway创建了一个API网关。网关使用Spring OAuth2 Client连接Keycloak。Spring Session存在,配置为与Redis一起工作(@EnableRedisWebSession)。在重定向到Keycloak登录页面并成功验证后,我看到会话保存在Redis。
网关的单个实例可以工作,但我遇到以下情况时失败:
-
运行网关的单个实例。我重新启动网关,并尝试继续web会话。在这种情况下,对Keycloak的请求有一个重定向循环(直到达到最大值)。
-
在Kubernetes中运行多个网关实例。UI代码在某些请求(HTTP 302重定向到Keycloak登录)上失败。
似乎会话没有被正确复制,或者在我的设置中有其他暂时的东西导致了这个失败。
我在浏览器网络选项卡中看到数十个请求,例如:
Request URL: http://localhost:4200/auth/realms/aaa/protocol/openid-connect/auth?response_type=code&client_id=web&scope=openid&state=y_01vqws_irgZnJUflotT-RUQFMmWm7k215AZzPj9rU%3D&redirect_uri=http://localhost:4200/login/oauth2/code/web&code_challenge_method=S256&nonce=4qEqUZrMhyND3hvOIUfGepBJVGfGgXG_8dv6SLCKZ8M&code_challenge=ZCdyxrjbTC2b3zcI1bQA7s6xbOJCNjyFRk6tegP00vo
Response is 302 with:
Location: http://localhost:4200/auth/realms/aaa/protocol/openid-connect/auth?response_type=code&client_id=web&scope=openid&state=_J4fIzQTDL_ACzDjyLoyPT2CVlvhX7u9fHG0Aa3I5Og%3D&redirect_uri=http://localhost:4200/login/oauth2/code/web&code_challenge_method=S256&nonce=DA-BVAeav9yisT4v1JjZCgrhH286fKCYO6BEAgptTWI&code_challenge=aRIB_A9BHdaySrFCftYbns-wn42Gy8urX-dXcaTwb04
问题是OAuth2客户端没有设置为复制。这里讨论了解决方案OAuth 2.0客户机支持应用程序集群
将以下bean添加到配置中可以解决此问题:
@Bean
public ServerOAuth2AuthorizedClientRepository authorizedClientRepository() {
return new WebSessionServerOAuth2AuthorizedClientRepository();
}