4

我正在使用 Flask-HTTPAuth 进行身份验证。我想根据请求是否经过身份验证从视图中显示不同的数据。装饰视图auth.login_required仅向经过身份验证的用户显示。如何测试请求是否已使用 Flask-HTTPAuth 进行身份验证?

auth = HTTPBasicAuth()

@app.route("/clothesInfo")
@auth.login_required
def show_info():
    return jsonify(blah blah blah)
4

3 回答 3

5

你想要的其实很容易实现。在您的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)
于 2016-12-15T07:47:36.057 回答
3

你可以装饰一个返回的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 而不是到处添加装饰器

于 2016-12-14T21:28:28.503 回答
1

自 2020 年 4 月以来,事情变得更简单了。

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')
于 2021-05-19T16:07:33.513 回答