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

Я работаю с RESTful API моей компании для запроса внутреннего сервера. Мои запросы нормально работают при отправке из браузера, но я блокируюсь при работе с python requests или с почтальоном. Я надеюсь:

  • Точно скопировать исходный запрос API (с заголовками и авторизацией), который я выполнил с помощью Chrome в моем скрипте python.
  • Если это все еще заблокирован, диагностируйте барьер, чтобы сообщить об этом нашему ИТ-руководителю (который никогда не обращался к API через что-либо, кроме браузера, и не хочет тратить время на решение этой проблемы).

Ввод для Chrome просто: https://<company-address>/<endpoint>

Когда я ввожу это в python:

import requests
r = requests.get(url=`https://<company-address>/<endpoint>`, verify=False, timeout=100)
    print(r.status_code)
    try:
        print(r.json())
    except:
        print(r.raise_for_status())

Получает трассировку:

Traceback (most recent call last):
  File "etapro_swagger.py", line 41, in <module>
    main()
  File "etapro_swagger.py", line 37, in main
    print(r.raise_for_status())
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://<company-address>/<endpoint>

Я попытался поместить свои глобальные учетные данные в заголовок с помощью headers={'username':'<user.name>', 'password': '<password>', но все еще не повезло.

В Chrome я пошел на Inspect -> Network -> Headers, чтобы проверить успешный запрос, но не знаю, как проверить, какие именно c заголовки должны быть введены в python или как это сделать.

Спасибо, и я рад предоставить больше информации по мере необходимости.

Ответы [ 2 ]

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

Вдохновленный другими постами, я посмотрел на заголовок ответа от chrome, и метод аутентификации был WWW-Negotiate, который отличается от базового c Аутентификация, и проблема решена.

Спасибо, что рассказали мне об этом!

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

Если ваша конечная точка использует комбинацию имени пользователя и пароля, вы должны быть в состоянии сделать следующее:

import requests
Username = '<username>'
Password = '<password>'
r = requests.get(url=`https://<company-address>/<endpoint>`, auth=(Username, Password), verify=False, timeout=100)
    print(r.status_code)
    try:
        print(r.json())
    except:
        print(r.raise_for_status())

, но, как правило, хранить их в виде простого текста в скрипте плохо. так что прочитайте https://blog.ruanbekker.com/blog/2018/04/29/encryption-and-decryption-with-simple-crypt-using-python/ и посмотрите, поможет ли это, как хотя бы зашифровать пароль при использовании. Независимо от того, что, однако, вы должны использовать учетную запись, которая имеет самый низкий уровень доступа для достижения sh цели.

...