请求在烧瓶中授权

时间:2018-03-13 23:56:16

标签: python python-2.7 flask werkzeug

我正在开发一个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。 服务方和申请方的授权是否有任何问题?

2 个答案:

答案 0 :(得分:2)

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

您必须调用标头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'], ''))

答案 1 :(得分:0)

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

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