Flask Rest API-如何在python请求中使用Bearer API令牌

时间:2018-07-05 13:41:04

标签: python flask python-requests

我已经在Flask中开发了一个API,并使用了基本的身份验证令牌。当我使用curl测试此API时,则接受了承载令牌并且API正常工作。但是在python请求中使用时,它显示401错误。

用于Flask API的Python代码:

@app.route('/api/resource')
@auth.login_required
def get_resource():
    return 

jsonify({'data':'你好,%s!'%g.user.username.title()})

使用curl进行测试可以正常工作: >

curl -u eyJhbGciOiJIUzI1NsdfCI6MTUzMDc5MDIzNCwiZXhwIjoxNT
   MwNzkwODM0fQ.eyJpZCsf.jKiafmv-qrvAxVo7UKQuohS2vkF-9scpuqsKRuw:sp -i -X GET 
   http://127.0.0.1:5000/api/resource
   HTTP/1.0 200 OK
   Content-Type: application/json
Content-Length: 32
Server: Werkzeug/0.14.1 Python/3.6.4
Date: Thu, 05 Jul 2018 11:33:22 GMT
{  "data": "Hello, FlaskAPI!"}

使用API​​的Python代码:

import requests
url = "http://127.0.0.1:5000/api/resource"
headers = {
    'Content-Type': "application/json",
    'Authorization': "Bearer eyJhbGciOiJIUzI1NiIsImlhsfsdfsdzNCwiZXhwIjoxNTMwNzksdfsdsdRF.eyJpZCI6MX0.YhZvjKiafmv-qrvAxVo7UKQuohS2vkF-9scpuqsKRuw"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)

它显示错误: 未经授权的访问401

如何使用Python或邮递员在curl中使用的Bearer令牌?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您希望我们使用无记名令牌,请看一下Miguel Grinberg的Application Programming Interfaces,然后向下滚动到“用户模型中的令牌”。但是,整个事情值得一读。

另一篇文章是Real Pythons的Token-Based Authentication with Flask

这两种方法都有助于理解和实施承载令牌。

答案 1 :(得分:0)

curl -u不使用承载令牌,而是使用BasicAuth(通过登录名和密码)。试试这个:

url = 'http://%s:%s@127.0.0.1:5000/api/resource' % (
    'eyJhbGciOiJIUzI1NiIsImlhsfsdfsdzNCwiZXhwIjoxNTMwNzksdfsdsdRF.eyJpZCI6MX0.YhZvjKiafmv-qrvAxVo7UKQuohS2vkF-9scpuqsKRuw',
    'sp',
)
headers = {
    'Content-Type': 'application/json',
}
response = requests.request("GET", url, headers=headers)

但是推荐的方法是传递登录名和密码encoded in header

import base64
url = 'http://127.0.0.1:5000/api/resource'
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Basic %s' % base64.b64encode('%s:%s' % (
            'eyJhbGciOiJIUzI1NiIsImlhsfsdfsdzNCwiZXhwIjoxNTMwNzksdfsdsdRF.eyJpZCI6MX0.YhZvjKiafmv-qrvAxVo7UKQuohS2vkF-9scpuqsKRuw',
            'sp',
        ),
    ),
}
response = requests.request("GET", url, headers=headers)