Я использую провайдера openID для аутентификации пользователей моего flask приложения. После аутентификации на веб-сайте аутентификации провайдер отправляет моей конечной точке обратного вызова id_token, несущий информацию о пользователе, как запрос POST
.
Я декодирую этот токен, создаю объект пользователя и сохраняю его в кеше. После сохранения пользователя, пользователь вошел в систему с помощью flask_login.login_user()
, функция перенаправляет на домашнюю страницу
@app.route("/opentoken", methods=['POST'])
def openid_callback():
token = request.form['id_token']
decoded_token = jwt.decode(token, verify=False)
preferred_username = decoded_token['preferred_username']
user = save_user(preferred_username, decoded_token)
login_user(user)
log.info(current_user) #That confirms the current_user has the user info
return redirect('/home')
Ожидаемое поведение состоит в том, что при перенаправлении домашняя конечная точка будет иметь доступ к flask_login.current_user
. Это должно произойти, потому что интеграция flask -login должна заставить flask вызывать эту функцию перед каждым запросом.
@app.login_manager.user_loader
def load_user(_id):
try:
user = users[_id]
return user
except KeyError:
return None
Однако реальное поведение отличается. Вызываемая конечная точка /home
не может получить доступ к current_user
после перенаправления
@home_bp.route('/home')
def home():
print(f"Current User: {current_user}") #This returns that the user is AnonymousMixin
return render_template(....)
Тем не менее, если страница обновляется (конечная точка вызывается напрямую), она может выбрать current_user
и печатает информацию вошедшего в систему пользователя.
Другими словами, при перенаправлении обратный вызов login_manager.user_loader
flask -login не вызывается, но вызывается как обычно, когда конечная точка вызывается напрямую.
Я не уверен если я что-то пропустил или неправильно понял, или есть специфическая ошибка, вызывающая такое поведение.