Flask OIDC 用户登录为 true 但 token 为 None

Lor*_*Nap 5 python flask openid-connect

我正在使用 Flask-OIDC 库对外部服务执行用户身份验证。

当用户第一次登录时,ODIC 库运行良好。我可以看到用户信息和从外部身份验证生成的承载令牌。

当我刷新页面时出现问题。如果我检查用户登录状态,ODIC 库会告诉我用户已登录,但令牌是None。看这段代码:

@pdo_route.route('/edit_pdo', methods=['GET', 'POST'])
@oidc.require_login
def edit_pdo():
  if oidc.oidc.user_loggedin:
     oidc.get_access_token() # is None
Run Code Online (Sandbox Code Playgroud)

回报却是。oidc.oidc.user_loggedinTrueoidc.get_access_token()None

这是我的 OIDC 配置:

{
'SECRET_KEY': 'secret',
'TESTING': True,
'DEBUG': True,
'OIDC_ID_TOKEN_COOKIE_SECURE': False,
'OIDC_REQUIRE_VERIFIED_EMAIL': False,
'OIDC_USER_INFO_ENABLED': True,
'OIDC_OPENID_REALM': 'flask-demo',
'OIDC_SCOPES': ['openid', 'email', 'profile', 'name'],
'OIDC_INTROSPECTION_AUTH_METHOD': 'client_secret_post',
'OIDC_CLIENT_SECRETS': app.config.get("OIDC_CLIENT_SECRETS_PATH")
}
Run Code Online (Sandbox Code Playgroud)

小智 2

对于未来的用户,请检查您是否仅使用 1 个线程或多个线程(gunicorn 等)运行此程序。如果您正在使用多个线程运行,则需要使用跨线程/实例工作的不同 impl 来更新您的credentials_store。

我使用 redis 进行了一个超级简单的实现,如下所示:

class RedisCredentialsStore(dict):

    def __setitem__(self, sub, item):
        flask.g.redis.set(sub, item)

    def __getitem__(self, sub):
        return flask.g.redis.get(sub)
Run Code Online (Sandbox Code Playgroud)