检查Flask-HTTPAuth是否在视图内部进行了身份验证

时间:2016-12-14 20:53:12

标签: python flask 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 个答案:

答案 0 :(得分:4)

您想要的实际上非常容易实现。在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)

答案 1 :(得分: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 rather than adding decorator everywhere

答案 2 :(得分:0)

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

Flask-HTTPAuth 4.0.0 向 optional 添加了 login required 参数来实现这一点。

来自the docs

<块引用>

一个可选的可选参数可以设置为 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')