如何设置 OpenID 以与负载均衡器一起使用?
How to setup OpenID to work with load balancer?
我目前使用的堆栈是:
钥匙斗篷
烧瓶
类烧瓶
nginx 作为负载均衡器
我的设置是我有两个服务实例 运行(实例 1、实例 2)。我面临的问题是:
用户使用 Web 浏览器通过转到 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 的工作原理之后,我有点怀疑它与状态参数 (https://auth0.com/docs/protocols/oauth2/oauth-state) 有关。同样,我不完全确定。但它必须是 instance1 本地的东西,instance2 没有。
人们如何解决这个问题?这种设置甚至可能吗?
Note that you should probably provide the library with a place to store the credentials it has retrieved for the user. These need to be stored in a place where the user themselves or an attacker can not get to them. To provide this, give an object that has setitem and getitem dict APIs implemented as second argument to the init() call. Without this, the library will only work on a single thread, and only retain sessions until the server is restarted.
指的是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, ...)
我目前使用的堆栈是: 钥匙斗篷 烧瓶 类烧瓶 nginx 作为负载均衡器
我的设置是我有两个服务实例 运行(实例 1、实例 2)。我面临的问题是:
用户使用 Web 浏览器通过转到 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 的工作原理之后,我有点怀疑它与状态参数 (https://auth0.com/docs/protocols/oauth2/oauth-state) 有关。同样,我不完全确定。但它必须是 instance1 本地的东西,instance2 没有。
人们如何解决这个问题?这种设置甚至可能吗?
Note that you should probably provide the library with a place to store the credentials it has retrieved for the user. These need to be stored in a place where the user themselves or an attacker can not get to them. To provide this, give an object that has setitem and getitem dict APIs implemented as second argument to the init() call. Without this, the library will only work on a single thread, and only retain sessions until the server is restarted.
指的是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, ...)