OAuth 和粘性 session

标签 oauth oauth-2.0 authorization load-balancing

我使用 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/

相关文章:

如果授权失败,Asp.net mvc [Authorize] 属性将返回 http 302 而不是 http 401

asp.net-core - 为了安全起见,在 .net mvc 中对整个项目授权属性

java - 按方法和用户进行 ReSTLet 授权

javascript - 使用 Google App Script 对可汗学院 API 的 OAuth1 调用进行身份验证

oauth - OAuth token 有哪些特征?

google-app-engine - Google Endpoints API + Chrome 扩展为 endpoints.get_current_user().user_id() 返回 None

android - 如何在 Java 中单击按钮时在我的 Android 应用程序中注销 Google 用户?

oauth - AOL openid网站验证

python - 使用 python-oauth2 的 Evernote OAuth 示例

python - Django token 发行和范围