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

问题描述 投票:0回答:1

我当前正在使用的堆栈是:钥匙斗篷烧瓶长颈瓶nginx作为负载均衡器

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

  1. [用户使用Web浏览器通过转到https://mycompany.com/auth/login进行身份验证
  2. instance1处理此请求并将用户重定向到Keycloak进行身份验证
  3. Keycloak使用重定向URL(https://mycompany.com/auth/auth_callback)将用户重定向回应用程序
  4. 这次负载均衡器将请求路由到实例2的重定向URL。在这里,instance2错误来自Keycloak的响应,内容为“ {'error':'invalid_grant','description':'Indirect redirect uri'}”,这很混乱,因为重定向uri是正确的。

    我不完全确定为什么此设置无法正常工作。但是在通读openID的工作原理后,我怀疑它与状态参数(https://auth0.com/docs/protocols/oauth2/oauth-state)有关。再次,我不确定。但这必须是instance1唯一的东西,instance2没有的。

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

flask openid keycloak flask-oidc
1个回答
0
投票

来自documentation

请注意,您可能应该为图书馆提供一个位置,以存储为用户检索到的凭据。这些必须存储在用户自己或攻击者无法接触到的地方。为此,请提供一个对象,该对象具有setitemgetitem dict API,这些API被实现为init()调用的第二个参数。没有此功能,该库将仅在单个线程上工作,并且仅保留会话,直到服务器重新启动为止。

它指的是credentials_store实例中的OpenIDConnect选项。为了支持通过多个应用程序实例的持久登录,此用例将需要持久共享数据存储。您可以使用共享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, ...)
© www.soinside.com 2019 - 2024. All rights reserved.