Flask Rest API - Как использовать токен Bearer API в запросах Python - PullRequest
0 голосов
/ 05 июля 2018

Я разработал API во Flask и использую токен базовой аутентификации. Когда я тестирую этот API с помощью curl, токен на предъявителя принимается и API работает. Но при использовании в запросах Python выдает ошибку 401.

Код Python, используемый для Flask API:

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

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!"}

Python-код для использования API:

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

Как использовать токен на предъявителя, используемый в curl из Python или почтальона?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если вы хотите, чтобы мы использовали токены на предъявителя, взгляните на Интерфейсы прикладного программирования Мигеля Гринберга и прокрутите вниз до «Токены в пользовательской модели». Однако все это заслуживает прочтения.

Еще одна статья - Real Pythons-аутентификация на основе токенов с Flask .

И то, и другое поможет понять и реализовать токены на предъявителя.

0 голосов
/ 05 июля 2018

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)

Но рекомендуемый способ - передать логин и пароль , закодированный в заголовке :

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)
...