【问题标题】:Check if Flask-HTTPAuth is authenticated inside view检查 Flask-HTTPAuth 是否在视图内通过身份验证
【发布时间】:2017-04-30 08:03:49
【问题描述】:
我正在使用 Flask-HTTPAuth 进行身份验证。我想根据请求是否经过身份验证从视图中显示不同的数据。使用auth.login_required 装饰视图仅向经过身份验证的用户显示。如何测试请求是否通过 Flask-HTTPAuth 进行了身份验证?
auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
return jsonify(blah blah blah)
【问题讨论】:
标签:
python
flask
flask-httpauth
【解决方案1】:
您可以使用login_required 装饰返回None 的函数。未认证时调用会返回错误响应,认证时调用会返回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】:
你想要的其实很容易实现。在您的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)
【解决方案3】:
自 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')