【问题标题】:Request authorization in flask在烧瓶中请求授权
【发布时间】:2018-08-22 09:25:02
【问题描述】:

我正在开发一个 Flask 应用程序,它可以调用在 Flask 中开发的 REST 服务。目标 REST 服务方法使用基本身份验证进行保护。我发现对于这种类型的身份验证,我必须使用 base64 编码。 我正在尝试以这种方式将凭据传递给服务:

headers = {'username': base64.b64encode(g.user['username'])}
response = requests.post('http://127.0.0.1:3000/api/v1.0/follower/' + username, headers=headers)

在服务端,用户名被获取为:

user_name = request.authorization.username

但是,该服务无法授权所提供的凭据,并引发错误 401。 服务端和应用端的授权有问题吗?

【问题讨论】:

    标签: python python-2.7 flask werkzeug


    【解决方案1】:

    您没有创建正确的基本授权标头。

    您必须调用标头Authorization,然后将标头值设置为字符串Basic <base64-of-username-and-password-separated-by-a-colon>

    如果我们假设密码为空,则如下所示:

    headers = {
        'Authorization': 'Basic {}'.format(
            base64.b64encode(
                '{username}:{password}'.format(
                    username=g.user['username'],
                    password='')
            )
        ),
    }
    

    查看协议客户端的Wikipedia description

    但是,没有必要手动构造它,因为requests 会在您将用户名和密码作为元组传递给auth 关键字时为您创建标头:

    response = requests.post(
        'http://127.0.0.1:3000/api/v1.0/follower/' + username,
        auth=(g.user['username'], ''))
    

    【讨论】:

    • 在服务端是正确的获取用户名的语法:user_name = request.authorization.username
    【解决方案2】:

    对我来说,工作代码是,但可能有一些错误。

    headers = {
            'Authorization': 'Basic {}'.format(
                base64.b64encode(
                    '{username}:{password}'.format(
                        username=g.user['username'],
                        password='').encode()
                ).decode()
            )
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多