我尝试使用Flask和HTTP Basic Auth创建登录系统。我的问题是,我有责任从数据库提供用户信息,还是basicauth为我创建和访问这些数据库?如果它没有,我可以用它来做什么?
答案 0 :(得分:11)
Werkzeug可以为您解码基本授权标头,用户名和密码。剩下的由你来决定你想要用这些信息做什么。
request.authorization
attribute返回Authorization
object。对于基本身份验证标头,仅设置了username
和password
。
一个简单的Flask snippet可用于在装饰器中使用该对象来保护Flask路由免受某些硬编码信息的影响。
像Flask-Login
这样的项目可以帮助您使用基本授权管理更复杂的登录,并将其与您提供的用户模型联系起来。该模型可以存储在数据库或您想要的任何其他内容中。
您可以查看Flask-Security以获得更完全集成的安全包,该安全包使用Flask-Login和其他包来提供基本身份验证和基于会话的登录。
答案 1 :(得分:8)
Flask-HTTPAuth扩展(无耻插件,我是作者)简化了HTTP Basic Auth的实现。您可以直接设置回调函数,而不是直接使用request.authorization
数据。
关于您的数据库问题,Flask-HTTPAuth不会对用户的存储方式做出任何假设。您必须提供检索用户和验证密码的逻辑。
答案 2 :(得分:0)
Werkzeug将Authorization
标头解析为request.authorization
Authorization
对象。
出于安全原因,如果浏览器首次收到带有WWW-Authenticate
标头集的401错误响应,则该浏览器可能只会发送此标头。不同的客户端(例如请求库)将直接发送标头。
最简单的演示是装饰器检查request.authorization
并返回401响应(如果未设置),或者凭据无效。实际上,您应该使用Flask-Login或Flask-HTTPAuth等扩展程序来管理它。
from functools import wraps
from flask import request
def login_required(f):
@wraps(f)
def wrapped_view(**kwargs):
auth = request.authorization
if not (auth and check_auth(auth.username, auth.password)):
return ('Unauthorized', 401, {
'WWW-Authenticate': 'WWW-Authenticate': 'Basic realm="Login Required"'
})
return f(**kwargs)
return wrapped_view
@app.route('/secret')
@login_required
def secret():
return f'Logged in as {request.authorization.username}.'
import requests
response = requests.get('http://127.0.0.1:5000/secret', auth=('world', 'hello'))
print(response.text)
# Logged in as world.