如何设置 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
请注意,您可能应该为库提供一个地方来存储它为用户检索到的凭据。这些需要存储在用户自己或攻击者无法获取的地方。为此,请提供一个对象,该对象具有 setitem 和 getitem 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 以使用负载均衡器?的主要内容,如果未能解决你的问题,请参考以下文章