Найти - Пользователи
Полная версия: python реализация авторизации по двухфакторной аутентификации
Начало » Python для новичков » python реализация авторизации по двухфакторной аутентификации
1
laughingman
Здравствуйте, подскажите пожалуйста, как на python можно аторизоваться на ресурсе который требует двухфакторную аутентификацию?

Сначала нужно подсунуть сертификат, сервер перенаправляет на страницу для ввода логина пароля , причем у этой страницы порт другой. Логины пароли и сертефикаты все есть, я не понимаю как такую авторизацию на python сделать. Подскажите, может кто сталкивался.
ZerG
Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Потом эти действия автоматизировать уже на питоне.
Для того что бы можно было удобнее работать с рав запросами скачайте какой либо http клиент.
хотябы и httpie или Postman
laughingman
ZerG
Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Это как раз известно, я буквально не знаю как заставить скрипт, сначала обратиться по урлу чтоб сертификат подсунуть а потом в той же сессии по другому урлу ввести логин пароль
FishHook
laughingman
а потом в той же сессии
А что в данном случае, вы имеете в виду под сессией?
laughingman
Ну смотрите, когда я авторизуюсь через обычный браузер.
Открываю браузер, появляется окошко в котором я выбираю сертификат и нажимаю окей, после этого идет редирект на другую страницу, там форма для ввода логина пароля. Я так понимаю это все делается за одну сессию, то есть сервер понимает, что тот кто предъявил сертификат и вводит пароль в поле формы это один и тот-же юзер
Вот как то же самое сделать питоновским скриптом?
FishHook
laughingman
Нет, сессия это соединение. Баузер создает соединение с сервером, отправляет запрос и пролучает ответ. После этого соединение разрывается. В вашем случае, браузер получил ответ с кодом, напрмер, 301. Браузер в ответ на это, сроздает новое соединение и отправляет на него гет-запрос.
Вам надо в вашем скрипте все это повторить. Это простой последовательный код.
laughingman
Смотрите, вот прям базовый пример того как я пытаюсь дать серверу сертификат

     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'))
в response я получаю вот такое
 {'serviceName': 'SSO/8.2.1.1/AuthenticationService', 'errorCode': 'AuthenticationError', 'userMessage': 'User is not authenticated to perform this request.', 'developerMessage': 'Unknown authentication type'}

А как правильно мне нужно отправлять на сервер сертификат, чтоб потом обработать редирект?
FishHook
laughingman
А как правильно мне нужно отправлять на сервер сертификат, чтоб потом обработать редирект?
А кто ж знает то, как оно в данном конкретном случае правильно? Есть только два путя:
1) вы используете документированные api, и тогда вам надо следовать согласно документации
2) вы “хакаете” какой-то ресурс, и тогда вам надо заниматься реверс-инжинирингом, никакого универсального ответа здесь нет. Если разработчики сервиса не хотят, чтобы к нему обращались скриптами, то они скорее всего придумают как усложнить вам жизнь.
py.user.next
laughingman
Я так понимаю это все делается за одну сессию, то есть сервер понимает, что тот кто предъявил сертификат и вводит пароль в поле формы это один и тот-же юзер
Сессия - это множество запросов, обединённых в последовательность. Вот эта вещь поддерживается каким-то способом. Например, в печенье сервер говорит “ты послал запрос 1, ты будешь тогда пользователь 1”, твой клиент сохраняет у себя это печенье “я пользователь 1”. При следующем запросе твой клиент посылает серверу сообщение “я пользователь 1, вот моё печенье”. Сервер его получает и говорит “а, раз ты пользователь 1, то вот тебе страница по прошлому запросу, и вот тебе печенье новое, что ты пользователь 1”. Клиент опять сохраняет это печенье. Так эта сессия может хранить ещё и параметры какие-то, которые меняются в процессе запросов, хранить состояние клиента, хранить состояние сервера для более умной работы. Это например.
Вот так цепочка запросов и продолжается, связываясь воедино через печенье, которым обмениваются клиент и сервер.

Так что тебе нужно глубже проанализировать взаимодействие. Для этого ты открываешь в браузере Инструменты разработчика и там во вкладке Сеть смотришь, что пересылается во время запросов в заголовках HTTP-протокола. Печенье ставится через эти пересылаемые заголовки.

Обычно через печенье это идёт, но бывают там ещё способы. Чаще всего на печенье всё это построено.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB