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

ktt*_*ttr 4 python login basic-authentication flask

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

Mar*_*ers 12

Werkzeug可以为您解码基本授权标头,用户名和密码.剩下的由你来决定你想要用这些信息做什么.

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

一个简单的Flask片段可用于在装饰器中使用该对象来保护Flask路由免受某些硬编码信息的影响.

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

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


Mig*_*uel 8

烧瓶HTTPAuth扩展(无耻插头,我是作者)简化了HTTP基本认证的实施.request.authorization您可以设置回调功能,而不是直接使用数据,您可以在其中插入身份验证逻辑.

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


dav*_*ism 8

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}.'
Run Code Online (Sandbox Code Playgroud)
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}.'
Run Code Online (Sandbox Code Playgroud)