Как добавить учетные данные для входа через скрипт python? - PullRequest
0 голосов
/ 29 мая 2020

Я уверен, что это где-то ответ на вопрос, но я не смог найти для себя решения (если вы знаете дубликат, не стесняйтесь его пометить).

Моя цель - запросить RESTful API. Для этого мне нужно пройти аутентификацию. Единственный доступный для меня способ использования этого API - через веб-браузер.

Обычно я загружаю URL-адрес, который перенаправляет на другой URL-адрес. Во втором URL-адресе есть форма, в которой мне нужно ввести username и password для аутентификации. В настоящее время я ввожу учетные данные вручную через веб-браузер.

Мой вопрос: могу ли я сделать это программно, чтобы мне не приходилось вручную вводить учетные данные через веб-браузер?

Примечание: веб-страница не проверена.

Попытка 1

Я пробовал следующие команды, но ни одна из них не сработала:

curl -k -u username:password https://myurl:port

Ничего не вернуло.

Попытка 2

BASE_URL = 'https://myurl:port'
username = 'username'
password = 'password'
r = requests.get(BASE_URL, auth=(username, password), verify=False)
print(r.status_code, r.reason)

печатает <Response [200]>, но не аутентифицируется. Это потому, что когда я пытаюсь запросить конечную точку API, она говорит, что я не авторизован. Когда я ввожу учетные данные вручную в браузере - тогда запрос конечной точки работает.

Попытка 3

Наконец, я подумал (но не сделал) мне нужен какой-то способ чтобы прочитать страницу входа и ввести учетные данные, получив элементы html и затем щелкнув логин (например, с использованием селена), но это кажется слишком грубым и подверженным ошибкам. Может быть, есть более элегантный способ.

Есть идеи, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Обычно я загружаю URL-адрес, который перенаправляет на другой URL-адрес. Во втором URL-адресе есть форма, в которой мне нужно ввести имя пользователя и пароль для аутентификации

Из вашего описания похоже, что вы получаете доступ к API с использованием OAuth2 с предоставлением кода авторизации flow? ... который по замыслу требует, чтобы пользователь (= владелец ресурса) авторизовал (через форму) ваше приложение (= клиент) для доступа к его / ее данным, предоставляемым API (= сервером ресурсов). в этом случае использование basi c auth (попытки 1 и 2) вам не поможет, поскольку API ожидает токен, а не имя пользователя / пароль. вам, вероятно, понадобится токен refre sh, срок действия которого не истекает и который позволит вашему клиенту запрашивать токен доступа fre sh каждый раз, когда он хочет получить доступ к API ...

Все зависит от механизм аутентификации, используемый вашим API ... Сначала я выясню, действительно ли ваш API использует OAuth2, и если да, узнайте о потоках аутентификации (например, https://www.udemy.com/course/learn-oauth-2/) ... поток учетных данных клиента это, вероятно, то, что вам нужно, если API позволяет это ...

update : Попытка 3, возможно, стоит попробовать, хотя я никогда этого не делал. вы могли бы отправить учетные данные, отправив соответствующие данные формы через python запросы ... тогда это теоретически должно предоставить вам код авторизации, который вы можете использовать для получения токена ...

0 голосов
/ 30 мая 2020

Спасибо, что показали нам свои попытки.

Если попытка 2 вернет код состояния 200. Это означает, что он работает, что означает, что basic auth работает. Простое решение - просто передать auth=(username, password) всем вашим вызовам api.

Или вы можете использовать requests.Session() для однократной аутентификации и сохранения сеанса при условии, что сервер поддерживает аутентификацию сеанса.

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

...