Вход в NBAPI Aruba для Mobility Master с ошибками запросов - PullRequest
0 голосов
/ 19 февраля 2019

Я использую requests, чтобы позвонить в NBAPI Арубы для мастера мобильности.Их документация недостаточна с примерами Python.API требует начальной аутентификации для получения UID, на который необходимо ссылаться в каждом запросе GET.Я не могу заставить логин работать в Python.

Я использую GET-запрос, который может быть частью проблемы, но я понимаю, что curl пример, предоставленный Aruba, метод GET по умолчанию:использовался.Обратите внимание, что я также не проверяю сертификат SSL, поскольку моей конечной целью является предоставление доступа без участия пользователя.

Вот команда curl, которую они предлагают для аутентификации

curl --insecure -c "aruba-cookie-jar" -d "username=username&password=password" https://<url-here>:4343/v1/api/login

Вывод команды:

{"_global_result": {"status":"0", "status_str": "You've logged in successfully.", "UIDARUBA":"<key output here>"}}

Я попытался преобразовать это в python с помощью «запросов», как показано ниже

import requests

session = requests.Session()
session.verify = False
r = session.get('https://<url-here>:4343/v1/api/login', auth=('username', 'password'))

При проверке ответа (ipython) я получаю следующее

In [6]: r.status_code
Out[6]: 401
In [7]: print(r.text)
{"_global_result": {"status":"1", "status_str": "Unauthorized request, authentication failed"}}

Что я делаю не так с этим запросом?При использовании метода POST в Python получается тот же вывод.Я думаю, что метод auth, используемый в моем примере с Python, неверен.

1 Ответ

0 голосов
/ 19 февраля 2019

Вы не делаете тот же запрос.Переключатель -d для curl отправляет данные POST , а не заголовок авторизации.Из документации curl:

-d, --data <data>

(HTTP) Отправляет указанные данные в POST-запросе на HTTP-сервер так же, как браузер, когдапользователь заполнил форму HTML и нажимает кнопку отправки.Это приведет к тому, что curl передаст данные на сервер с использованием application-type / x-www-form-urlencoded.

Вы используете запрос GET, а не POST.Отправьте имя пользователя и пароль в аргументе data, здесь можно использовать словарь, чтобы иметь requests дескриптор, кодирующий его в отформатированное тело запроса application/x-www-form-urlencoded:

session = requests.Session()
session.verify = False
login_info = {'username': 'username', 'password': 'password'}
r = session.post('https://<url-here>:4343/v1/api/login', data=login_info)

В общем, документация API, котораяиспользует curl примеры командной строки, рассчитанные на минимальное знакомство с этим инструментом, всегда стоит прочитать curl manpage , чтобы понять, что делают переключатели, а также иметь минимальное понимание заголовков HTTPи лайки.

Если сомневаетесь, используйте curl и requests, чтобы отправить запрос на тестовый сайт httpbin.org и сравнить результаты.Здесь использование конечной точки /anything с curl дает:

$ curl --insecure -c "aruba-cookie-jar" -d "username=username&password=password" https://httpbin.org/anything
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "password": "password",
    "username": "username"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "35",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0"
  },
  "json": null,
  "method": "POST",
  "origin": "...",
  "url": "https://httpbin.org/anything"
}

, в то время как ваш request код выводит:

>>> import requests
>>> session.verify = False
>>> r = session.get('https://httpbin.org/anything', auth=('username', 'password'))
/.../lib/python3.8/site-packages/urllib3/connectionpool.py:842: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  warnings.warn((
>>> print(r.text)
{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.21.0"
  },
  "json": null,
  "method": "GET",
  "origin": "...",
  "url": "https://httpbin.org/anything"
}

, который, как мы надеемся, составитПонятнее, в чем здесь различия.

...