Как получить доступ к API на основе токенов с помощью модуля запросов в python? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу вызвать один API из другого API. Итак, внешний API имеет аутентификацию на основе токена jwt.

import requests
response = requests.get('http://host:port/api/users', auth= ("username","password"))

Я получаю сообщение об ошибке:

{"error":"authentication failed: jwt parse error: token contains an invalid number of segments","code":16,"message":"authentication failed: jwt parse error: token contains an invalid number of segments","details":[]}

Или, сначала мне нужно вызвать API входа в систему, получить токен и при вызове другого API применяет этот токен в заголовке. Если это так, то почему параметр «auth» присутствует в requests.get(URL, auth=(username,password))?

1 Ответ

0 голосов
/ 28 апреля 2020

Вот (с точки зрения высокого уровня) механизм, стоящий за запросами:

Когда запрос сформирован request(method, url, **kwargs), только аргументы метода и URL-адреса являются обязательными, остальные являются необязательными:

:param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.

Впоследствии с точки зрения методов:

def get(url, params=None, **kwargs):
    r"""Sends a GET request.
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.
    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    return request('post', url, data=data, json=json, **kwargs)

Для get и post обязательным аргументом является URL-адрес, а остальные являются значениями по умолчанию или необязательными.

Многим веб-службам может потребоваться аутентификация, например HTTP Basi c Auth . Это самый простой вид, и Requests поддерживает его прямо из коробки.

from requests.auth import HTTPBasicAuth
requests.get('http://host:port/api/users', auth=('user', 'pass'))

То же самое с

from requests.auth import HTTPBasicAuth
requests.get('http://host:port/api/user', auth=HTTPBasicAuth('user', 'pass'))

Так что в принципе очень важно, как API был реализован из точка зрения аутентификации (HTTPBasicAuth, HTTPDigest Authentication, OAuth1). Исходя из этого, вы можете использовать соответствующий модуль (в пределах requests) для аутентификации.

Надеюсь, это поможет

...