Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2020 13:51:40

laughingman
Зарегистрирован: 2018-06-21
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

Здравствуйте, подскажите пожалуйста, как на python можно аторизоваться на ресурсе который требует двухфакторную аутентификацию?

Сначала нужно подсунуть сертификат, сервер перенаправляет на страницу для ввода логина пароля , причем у этой страницы порт другой. Логины пароли и сертефикаты все есть, я не понимаю как такую авторизацию на python сделать. Подскажите, может кто сталкивался.

Офлайн

#2 Июнь 22, 2020 14:24:24

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Потом эти действия автоматизировать уже на питоне.
Для того что бы можно было удобнее работать с рав запросами скачайте какой либо http клиент.
хотябы и httpie или Postman



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Июнь 22, 2020 14:27:34

laughingman
Зарегистрирован: 2018-06-21
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

ZerG
Сначала надо разобрать метод аутентификации дебагером в той же мозилле и посмотреть что куда ложить.
Это как раз известно, я буквально не знаю как заставить скрипт, сначала обратиться по урлу чтоб сертификат подсунуть а потом в той же сессии по другому урлу ввести логин пароль

Офлайн

#4 Июнь 22, 2020 14:30:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

laughingman
а потом в той же сессии
А что в данном случае, вы имеете в виду под сессией?



Офлайн

#5 Июнь 22, 2020 14:34:52

laughingman
Зарегистрирован: 2018-06-21
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

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

Отредактировано laughingman (Июнь 22, 2020 14:36:01)

Офлайн

#6 Июнь 22, 2020 15:52:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

laughingman
Нет, сессия это соединение. Баузер создает соединение с сервером, отправляет запрос и пролучает ответ. После этого соединение разрывается. В вашем случае, браузер получил ответ с кодом, напрмер, 301. Браузер в ответ на это, сроздает новое соединение и отправляет на него гет-запрос.
Вам надо в вашем скрипте все это повторить. Это простой последовательный код.



Офлайн

#7 Июнь 22, 2020 15:59:59

laughingman
Зарегистрирован: 2018-06-21
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

Смотрите, вот прям базовый пример того как я пытаюсь дать серверу сертификат

     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'}

А как правильно мне нужно отправлять на сервер сертификат, чтоб потом обработать редирект?

Офлайн

#8 Июнь 22, 2020 16:42:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

laughingman
А как правильно мне нужно отправлять на сервер сертификат, чтоб потом обработать редирект?
А кто ж знает то, как оно в данном конкретном случае правильно? Есть только два путя:
1) вы используете документированные api, и тогда вам надо следовать согласно документации
2) вы “хакаете” какой-то ресурс, и тогда вам надо заниматься реверс-инжинирингом, никакого универсального ответа здесь нет. Если разработчики сервиса не хотят, чтобы к нему обращались скриптами, то они скорее всего придумают как усложнить вам жизнь.



Офлайн

#9 Июнь 23, 2020 02:01:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

python реализация авторизации по двухфакторной аутентификации

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

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

Обычно через печенье это идёт, но бывают там ещё способы. Чаще всего на печенье всё это построено.



Отредактировано py.user.next (Июнь 23, 2020 02:05:23)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version