Flask HTTP Basicauth - 它是如何工作的?

问题描述 投票:0回答:4

我正在尝试使用 Flask 和 HTTP Basic Auth 创建一个登录系统。我的问题是,我有责任提供数据库中的用户信息,还是 basicauth 为我创建和访问这些数据库?如果没有,我可以用什么来做到这一点?

python authentication flask basic-authentication
4个回答
21
投票

Werkzeug 可以为您将基本授权标头解码为用户名和密码。剩下的就取决于你想用这些信息做什么。

request.authorization
属性返回一个
Authorization
对象
。对于基本身份验证标头,仅设置
username
password

Flask-Login
这样的项目可以帮助您使用基本授权管理更复杂的登录,并将其与您提供的用户模型联系起来。该模型可以存储在数据库或您想要的任何其他内容中。

您可以查看 Flask-Security 以获得更完全集成的安全包,该包使用 Flask-Login 和其他包来提供基本身份验证和基于会话的登录。


20
投票

Flask-HTTPAuth扩展(无耻插件,我是作者)简化了HTTP Basic Auth的实现。您无需直接使用

request.authorization
数据,而是在插入身份验证逻辑的地方设置回调函数。

关于您的数据库问题,Flask-HTTPAuth 不对您的用户存储方式做出任何假设。您必须提供检索用户和验证密码的逻辑。


18
投票

Werkzeug 将

Authorization
标头解析为
request.authorization
,这是一个
Authorization
对象。

出于安全原因,浏览器可能仅在首次收到带有

WWW-Authenticate
标头集的 401 错误响应时发送此标头。不同的客户端,例如请求库,将直接发送标头。

最简单的演示是一个装饰器,它检查

request.authorization
并在未设置或凭据无效时返回 401 响应。在实践中,您应该使用诸如 Flask-LoginFlask-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': '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.

1
投票

这是一个使用 Python 装饰器函数的 Flask Basic 身份验证示例。

如果没有认证或认证错误,会返回401,需要认证。

烧瓶API

def check_auth(username, password):
    return username == 'username' and password == 'password'

def login_required(f):
    """ basic auth for api """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            return jsonify({'message': 'Authentication required'}), 401
        return f(*args, **kwargs)
    return decorated_function

@app.route('/', methods=["GET"])
@login_required
def home():
    return {"Hello": "world"}

在服务器上请求时

response = requests.get(url, auth=('username', 'password'))
© www.soinside.com 2019 - 2024. All rights reserved.