【问题标题】:OAuth2 authorization behind the LoadBalancerLoadBalancer 背后的 OAuth2 授权
【发布时间】:2020-09-29 18:27:57
【问题描述】:
我在负载均衡器 (F5) 后面运行 2 个 OAuth2 授权服务器实例。我正在使用JdbcTokenStore。一切正常,但有时我会收到错误“处理错误:InvalidGrantException,无效授权码:XXXXX”。
如果我只运行一个实例,我的服务工作正常,如果我运行两个实例,有时会失败。似乎如果负载均衡器在授权过程中混合对不同服务器的请求,一切都会失败。
我的问题是,我该如何解决这种问题?我应该在负载均衡器中使用 stickysession 吗?如果是,我什么时候可以使用 stickysession 确保高可用性?这是唯一的解决方案吗?
【问题讨论】:
标签:
java
spring-boot
spring-security
load-balancing
spring-oauth2
【解决方案1】:
我想您正在使用已经实现的 oauth2 授权服务器。在这种情况下,您需要确定他们在身份验证时是否使用会话,或者基于密钥签名的某些令牌系统。不同之处在于,当您使用密钥签名令牌时,例如带有签名的 JWT,连接是无状态的。服务器仅使用签名密钥验证请求中的传入令牌,因此有关该连接的信息不必存储在 memory/db 中。请注意,两台服务器必须使用相同的签名密钥,因此身份验证在每台服务器中都有效。在这种情况下,您不需要在负载均衡器中使用粘性会话。
您可以使用基于 JWT 和签名密钥的身份验证模型实现自定义 oauth2 授权服务器。您可以实现会话身份验证,但两个服务器必须使用共享的 jdbc 令牌存储,因此每个服务器都知道另一个服务器的有效身份验证。否则,您将不得不使用您在回答中提出的粘性会话
例如,Oauth2 资源服务器基于带有签名密钥的 JWT。