LoadBalancer背后的OAuth2授权

时间:2020-06-10 10:56:56

标签: java spring-boot spring-security load-balancing spring-oauth2

我在负载均衡器(F5)后面运行了2个OAuth2授权服务器实例。我正在使用JdbcTokenStore。一切正常,但有时会出现错误“ 处理错误:InvalidGrantException,无效的授权代码:XXXXX ”。 如果仅运行一个实例,则服务可以正常工作;如果运行两个实例,则有时会失败。看来,如果负载平衡器在授权过程中将请求混合到不同的服务器,一切都会失败。

enter image description here

我的问题是,如何解决此类问题?我应该在负载均衡器中使用 stickysession 吗?如果是,我何时可以通过 stickysession 确保高可用性?这是唯一的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我想您正在使用已经实现的oauth2授权服务器。在这种情况下,您需要确定他们在身份验证时是否正在使用会话,或基于密钥签名的某些令牌系统。区别在于,当您使用密钥签名令牌(例如带有签名的JWT)时,连接是无状态的。服务器仅使用签名密钥验证请求中的传入令牌,因此有关该连接的信息不必存储在内存/数据库中。请注意,两个服务器必须使用相同的签名密钥,因此身份验证在每个服务器中均有效。在这种情况下,您无需在负载均衡器中使用粘性会话。

您可以使用带有签名密钥的基于JWT的身份验证模型来实现自定义oauth2授权服务器。您可以实现会话身份验证,但是两个服务器必须使用共享的jdbc令牌存储,因此每个服务器都知道另一个服务器的有效身份验证。否则,您将不得不使用答案中建议的粘性会话

例如,Oauth2资源服务器基于带有签名密钥的JWT。