Форум сайта python.su
Здравствуйте, подскажите пожалуйста, как на python можно аторизоваться на ресурсе который требует двухфакторную аутентификацию?
Сначала нужно подсунуть сертификат, сервер перенаправляет на страницу для ввода логина пароля , причем у этой страницы порт другой. Логины пароли и сертефикаты все есть, я не понимаю как такую авторизацию на python сделать. Подскажите, может кто сталкивался.
Офлайн
Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Потом эти действия автоматизировать уже на питоне.
Для того что бы можно было удобнее работать с рав запросами скачайте какой либо http клиент.
хотябы и httpie или Postman
Офлайн
ZerGЭто как раз известно, я буквально не знаю как заставить скрипт, сначала обратиться по урлу чтоб сертификат подсунуть а потом в той же сессии по другому урлу ввести логин пароль
Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Офлайн
laughingmanА что в данном случае, вы имеете в виду под сессией?
а потом в той же сессии
Офлайн
Ну смотрите, когда я авторизуюсь через обычный браузер.
Открываю браузер, появляется окошко в котором я выбираю сертификат и нажимаю окей, после этого идет редирект на другую страницу, там форма для ввода логина пароля. Я так понимаю это все делается за одну сессию, то есть сервер понимает, что тот кто предъявил сертификат и вводит пароль в поле формы это один и тот-же юзер
Вот как то же самое сделать питоновским скриптом?
Отредактировано laughingman (Июнь 22, 2020 14:36:01)
Офлайн
laughingman
Нет, сессия это соединение. Баузер создает соединение с сервером, отправляет запрос и пролучает ответ. После этого соединение разрывается. В вашем случае, браузер получил ответ с кодом, напрмер, 301. Браузер в ответ на это, сроздает новое соединение и отправляет на него гет-запрос.
Вам надо в вашем скрипте все это повторить. Это простой последовательный код.
Офлайн
Смотрите, вот прям базовый пример того как я пытаюсь дать серверу сертификат
def start(self): url = 'https://alldealers.megafon.ru:8443/ps/auth/api/token' myobj = {'grant_type': 'password', 'username' : 'user_name', 'password': '************'} headers = {'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded'} response = requests.post(url, data=myobj, headers=headers, cert=('/var/python_script/certs/MEG_CNT_20200211_cert.pem', '/var/python_script/certs/MEG_CNT_20200211_cert.key'))
{'serviceName': 'SSO/8.2.1.1/AuthenticationService', 'errorCode': 'AuthenticationError', 'userMessage': 'User is not authenticated to perform this request.', 'developerMessage': 'Unknown authentication type'}
Офлайн
laughingmanА кто ж знает то, как оно в данном конкретном случае правильно? Есть только два путя:
А как правильно мне нужно отправлять на сервер сертификат, чтоб потом обработать редирект?
Офлайн
laughingmanСессия - это множество запросов, обединённых в последовательность. Вот эта вещь поддерживается каким-то способом. Например, в печенье сервер говорит “ты послал запрос 1, ты будешь тогда пользователь 1”, твой клиент сохраняет у себя это печенье “я пользователь 1”. При следующем запросе твой клиент посылает серверу сообщение “я пользователь 1, вот моё печенье”. Сервер его получает и говорит “а, раз ты пользователь 1, то вот тебе страница по прошлому запросу, и вот тебе печенье новое, что ты пользователь 1”. Клиент опять сохраняет это печенье. Так эта сессия может хранить ещё и параметры какие-то, которые меняются в процессе запросов, хранить состояние клиента, хранить состояние сервера для более умной работы. Это например.
Я так понимаю это все делается за одну сессию, то есть сервер понимает, что тот кто предъявил сертификат и вводит пароль в поле формы это один и тот-же юзер
Отредактировано py.user.next (Июнь 23, 2020 02:05:23)
Офлайн