我使用 OAuth 2 进行授权,需要在负载平衡集群中实现它。我考虑过几种方法,但似乎没有办法绕过集中式方法。以下是我的想法:
1。使用源 IP 进行平衡
将 token 缓存在一台服务器上并通过 IP 进行平衡是理想的选择,但是不能假设 IP 是静态的。因此,当同一用户尝试使用有效 token 访问需要另一个 IP 授权的服务时,它将失败,因为它没有缓存在 native 上。此外,使用该用户登录的其他设备也不会到达同一台计算机。
2。使用负载平衡 cookie 进行平衡
也不是真正的选择,因为不能假设每个客户端都实现 cookie 存储。
3。使用 Authorization
header 进行平衡
通过散列 Authorization: Bearer
token header 进行平衡是有问题的,因为第一个请求(用于请求授权 token )没有 Authorization
header ,因此以下请求可能不会命中同一个实例。
我当前的方法是使用中央 Redis 实例来存储授权 token 。 是否还有一种选择可以避免集中式方法?
最佳答案
我认为您还有两个选择需要考虑。
一是通过 session ID来平衡。应用程序服务器通常可以配置为通过 cookie 或添加到每个链接的 GET 参数来管理 session ,因此它不一定需要 cookie 存储。此外,很少有 HTTP 客户端仍未实现 cookie 存储,因此您可能需要重新考虑列表中的第 2 项。
另一种是使用独立的 token ,例如带有签名 (JWS) 的 JSON Web token (JWT)。自包含 token 的验证可能不需要中央数据库,每个服务器实例可以单独检查 token 签名并从 token 本身提取授权详细信息。但是,如果您需要撤销 token 的支持,您可能仍然需要一个中央数据库来存储至少一个撤销 token 的黑名单。
虽然我无法为您提供完整的解决方案,但希望这能给您一些想法。
关于OAuth 和粘性 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17732377/