Проверьте, аутентифицирован ли 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')
Другие вопросы по тегам