【问题标题】:Flask HTTP Basicauth - How does it work?Flask HTTP Basicauth - 它是如何工作的?
【发布时间】:2018-10-10 07:57:06
【问题描述】:

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

【问题讨论】:

  • basicauth 是与服务器交换用户名和密码的标准。它不会提供用户信息来进行身份验证,不。

标签: python login flask basic-authentication


【解决方案1】:

使用 python 装饰器函数的 Flask Basic 身份验证示例。 它将返回 401,如果不是 auth 或错误的 auth,则需要 Authentication。

FLask API

check_auth = lambda username, password: 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'))

【讨论】:

    【解决方案2】:

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

    request.authorization attribute 返回一个Authorization object。对于基本身份验证标头,仅设置了 usernamepassword

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

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

    【讨论】:

      【解决方案3】:

      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.
      

      【讨论】:

        【解决方案4】:

        Flask-HTTPAuth 扩展(无耻插件,我是作者)简化了 HTTP Basic Auth 的实现。您无需直接使用request.authorization 数据,而是在插入身份验证逻辑的位置设置回调函数。

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

        【讨论】:

        猜你喜欢
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多