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

spy*_*spy 10 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 
Run Code Online (Sandbox Code Playgroud)

jsonify({'data': 'Hello, %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!"}
Run Code Online (Sandbox Code Playgroud)

使用 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)
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢!

Eug*_*ako 1

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

但推荐的方法是传递标头中编码的登录名和密码:

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