Как добавить заголовки авторизации в API-клиент, созданный Bravado
Я могу создать простой интерфейс API, используя requests
модуль, который аутентифицируется правильно и получает ответ от API. Однако, когда я пытаюсь использовать браваду, создать клиента из файла подкачки и вручную добавить токен авторизации в заголовок, произойдет сбой с:
bravado.exception.HTTPUnauthorized: 401 Unauthorized: Error(code=u'invalid_credentials', message=u'Missing authorization header',
Я считаю, что правильно добавляю заголовки авторизации.
Код, который я использую для создания клиента, приведен ниже. Как показано, я попытался добавить токен авторизации двумя способами:
- в
http_client
настройка черезset_api_key
- в
Swagger.from_url(...)
шаг, добавивrequest_headers
,
Однако оба варианта терпят неудачу.
from bravado.requests_client import RequestsClient
from bravado.client import SwaggerClient
http_client = RequestsClient()
http_client.set_api_key(
'https://api.optimizely.com/v2', 'Bearer <TOKEN>',
param_name='Authorization', param_in='header'
)
headers = {
'Authorization': 'Bearer <TOKEN>',
}
client = SwaggerClient.from_url(
'https://api.optimizely.com/v2/swagger.json',
http_client=http_client,
request_headers=headers
)
У меня вопрос, как правильно добавить заголовки авторизации в бравадо SwaggerClient?
1 ответ
Для справки, возможное решение состоит в том, чтобы добавить _request_options
с каждым запросом:
from bravado.client import SwaggerClient
headers = {
'Authorization': 'Bearer <YOUR_TOKEN>'
}
requestOptions = {
# === bravado config ===
'headers': headers,
}
client = SwaggerClient.from_url("<SWAGGER_JSON_URL>")
result = client.<ENTITY>.<ACTION>(_request_options=requestOptions).response().result
print(result)
Однако лучшее решение, которое я до сих пор не могу заставить работать, - это автоматическая аутентификация с каждым запросом.
Попробуйте еще раз, исправив хост строки set_api_key.
from bravado.requests_client import RequestsClient
from bravado.client import SwaggerClient
http_client = RequestsClient()
http_client.set_api_key(
'api.optimizely.com', 'Bearer <TOKEN>',
param_name='api_key', param_in='header'
)
client = SwaggerClient.from_url(
'https://api.optimizely.com/v2/swagger.json',
http_client=http_client,
)
Здесь вы найдете документацию по методу: https://github.com/Yelp/bravado/blob/master/README.rst