Проверьте, аутентифицирован ли Flask-HTTPAuth внутри представления
Я использую Flask-HTTPAuth для аутентификации. Я хочу отображать различные данные из представления в зависимости от того, был ли запрос аутентифицирован или нет. Украшаем вид auth.login_required
показывает только авторизованным пользователям. Как я могу проверить, был ли запрос аутентифицирован с помощью Flask-HTTPAuth?
auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
return jsonify(blah blah blah)
3 ответа
То, что вы хотите, на самом деле очень легко реализовать. В вашем verify_password
обратный вызов, вы получите имя пользователя и пароль ''
когда пользователь не предоставляет учетные данные. Вы все еще можете вернуться True
из этой функции, и это позволит анонимному пользователю получить доступ к конечной точке.
Следующий пример демонстрирует эту технику:
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
if username == '' or password == '':
# anonymous user, we still let them in
g.current_user = None
return True
g.current_user = my_verify_function(username, password)
return g.current_user is not None
@app.route("/clothesInfo")
@auth.login_required
def show_info():
if g.current_user:
# prepare data for authenticated users here
pass
else:
# prepare data for anonymous users here
pass
return jsonify(data)
Вы можете украсить функцию, которая возвращает None
с login_required
, Вызов, пока не аутентифицирован, вернет ответ об ошибке, вызов, пока аутентифицированный, вернет None
,
# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)
def is_authenticated():
try:
# default implementation returns a string error
return login_required_dummy_view() is None
except HTTPException:
# in case auth_error_callback raises a real error
return False
@app.route('/info')
def info():
if is_authenticated():
# logged in view
else:
# basic view
Смотрите также Default login_required вместо добавления декоратора везде.
С апреля 2020 года все стало проще.
Добавлен Flask-HTTPAuth 4.0.0.
optional
аргумент
login required
делать именно это.
Из документов :
Необязательный необязательный аргумент может быть установлен в True, чтобы разрешить выполнение маршрута также, когда аутентификация не включена в запрос, и в этом случае auth.current_user() будет установлен в None. Пример:
@app.route('/private') @auth.login_required(optional=True) def private_page(): user = auth.current_user() return "Hello {}!".format(user.name if user is not None else 'anonymous')