Как добавить заголовки авторизации в 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

Другие вопросы по тегам