如何设置 OpenID 以使用负载均衡器?

Posted

技术标签:

【中文标题】如何设置 OpenID 以使用负载均衡器?【英文标题】:How to setup OpenID to work with load balancer? 【发布时间】:2020-02-13 20:53:10 【问题描述】:

我目前使用的堆栈是: 钥匙斗篷 烧瓶 烧瓶-oidc nginx作为负载均衡器

我的设置是我有两个正在运行的服务实例(instance1、instance2)。我面临的问题是:

    用户使用网络浏览器通过转到https://mycompany.com/auth/login 进行身份验证

    instance1 处理此请求并将用户重定向到 Keycloak 进行身份验证

    Keycloak 使用重定向 url (https://mycompany.com/auth/auth_callback) 将用户重定向回应用程序

    这一次负载均衡器将请求路由到重定向 url 到 instance2。这里 instance2 出错,Keycloak 的响应是“'error': 'invalid_grant', 'description': 'Incorrect redirect uri'”,这非常令人困惑,因为重定向 uri 是正确的。

    我不完全确定为什么这个设置不起作用。但是在阅读完 openID 的工作原理后,我有点怀疑它与 state 参数(https://auth0.com/docs/protocols/oauth2/oauth-state)有关。同样,我不完全确定。但它必须是 instance1 本地的东西,而 instance2 没有。

人们如何解决这个问题?这种设置是否可行?

【问题讨论】:

【参考方案1】:

来自documentation

请注意,您可能应该为库提供一个地方来存储它为用户检索到的凭据。这些需要存储在用户自己或攻击者无法获取的地方。为此,请提供一个对象,该对象具有 setitemgetitem dict API,作为 init() 调用的第二个参数实现。如果没有这个,库将只能在单个线程上工作,并且只会保留会话,直到服务器重新启动。

它指的是OpenIDConnect 实例化中的credentials_store 选项。要支持通过多个应用程序实例进行持久登录,您将需要一个用于此用例的持久共享数据存储。您可以使用共享 redis 或 dynamodb 实例。

credentials_store 的实现相当简单,您可以尝试类似的方法,

class RedisOpenIdCredStore:
    def __init__(self):
        # Handle Redis instance initialisation here
        pass

    def __setitem__(self, key, value):
        # Set item to redis
        pass

    def __getitem__(self, key):
        # Fetch and return item from redis if present
        pass

credential_store = RedisOpenIdCredStore()
oid_connect = OpenIDConnect(app, credential_store=credential_store, ...)

【讨论】:

啊!谢谢你。我试试看。

以上是关于如何设置 OpenID 以使用负载均衡器?的主要内容,如果未能解决你的问题,请参考以下文章

双WAN口路由器如何设置负载均衡

什么是负载均衡?CDN如何负载均衡流量?

如何配置 AWS 网络负载均衡器以使用 Terraform 路由 HTTPS 流量?

如何为 NGINX 负载均衡器设置例外

U8服务器参数配置中负载均衡如何设置

如何使用 CLI 配置 Elastic beanstalk 经典负载均衡器以终止 HTTPS