我们目前有 4 个使用 Spring Security Oauth2 项目进行身份验证的 Spring 应用程序。这些应用程序是 REST API,由我工作的公司的其他内部应用程序使用。
由于我们没有进行负载平衡,所以在开发和 QA 环境中一切正常,现在我们处于预生产阶段,我们面临负载平衡器 (LB) 的问题。
这是此问题的工作流程:
- 客户端发送对 oauth 令牌的请求
- LB 将请求重定向到 Box 1
- Box 1 验证并返回一个有效的 Bearer Token
- 客户端接收令牌并存储它以通过会话使用
- 客户端在 REST API 中发送对服务的请求,将先前检索到的令牌添加到标头
- LB 将请求重定向到 Box 2
- Box 2 无法进行身份验证,因为它无法识别令牌并返回 Invalid Credentials 响应
我们正在使用内存中的用户存储:
<bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.InMemoryTokenStore" />
有没有办法让不同的盒子共享同一个令牌存储?我知道有一个 JdbcTokenStore 可用于将令牌持久化到数据库,但我更愿意避免持久化令牌,因为这些应用程序指向仅存储业务信息的遗留数据库。