#python #flask #openid-connect
#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
oidc.oidc.user_loggedin
Возврат True
, но oidc.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")
}
Ответ №1:
Для будущих пользователей проверьте, используете ли вы это только с одним потоком или с несколькими (gunicorn или что-то подобное). Если вы работаете с несколькими потоками, вам необходимо обновить свой credentials_store другим impl, который работает в разных потоках / экземплярах.
Я использовал 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)