1

我目前使用的堆栈是: Keycloak flask flask-oidc nginx as load balancer

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

  1. 用户通过访问https://mycompany.com/auth/login使用 Web 浏览器进行身份验证

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

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

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

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

人们如何解决这个问题?这种设置甚至可能吗?

4

1 回答 1

1

文档

请注意,您可能应该为库提供一个地方来存储它为用户检索到的凭据。这些需要存储在用户自己或攻击者无法获取的地方。要提供此功能,请提供一个对象,该对象具有setitemgetitem dict 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, ...)
于 2019-10-17T05:01:27.920 回答