Обходной путь для Python & Selenium: проверка подлинности в Active Directory
Я использую Python (2.7) и Selenium (3.4.3) для управления Firefox (52.2.0 ESR) через geckodriver (0.19.0) для автоматизации процесса на компьютере с CentOS 7.
Мне нужна полностью автоматическая работа этой автоматики с учетными данными пользователя; Запрещено хранение и взлом.
Одна часть драмы вызвана тем фактом, что внутренний веб-сайт, необходимый для процесса, находится в домене Active Directory, а машина, на которой запущена моя автоматизация, - нет. У меня нет необходимости проверять пользователя, я просто передаю учетные данные на веб-сайт таким образом, чтобы не требовалось человеческого взаимодействия или чтобы человек был локальным пользователем на компьютере.
Я пробовал различные варианты:
- [Протокол]://[пользователь, пройти]@[URL]
- driver.switch_to_alert () + send_keys
Кажется, некоторые из них работают только в IE, к чему у меня нет доступа.
Я проверил библиотеки, чтобы справиться с этим и все безрезультатно.
Я могу добавить библиотеки в python, и у меня есть доступ sudo к машине - не могу коснуться аутентификации, поэтому интеграция с AD невозможна.
Как я могу предоставить этому веб-сайту AD учетные данные произвольного пользователя, чтобы не происходило локальное хранение их учетных данных и не требуется никакого взаимодействия с пользователем?
Спасибо
РЕДАКТИРОВАТЬ
Я думаю, что-то вроде прокси, который может аутентифицировать пользователя, а затем сохранить эту аутентификацию для селена, чтобы сделать свое дело... Существует ли простой прокси-сервер LDAP/AD?
РЕДАКТИРОВАТЬ 2
Возможно, очень простой способ заявить об этом - я хочу передать учетные данные пользователя и предотвратить появление всплывающего окна аутентификации.
1 ответ
Решение найдено:
Мне нужно было использовать расширение браузера. Мое решение было разработано для хрома, но оно должно быть почти неизменным для Firefox и, возможно, для края.
Прежде всего, вам нужно 2 API для вашего браузера:
Хотя оба API-интерфейса браузера очень похожи, они имеют некоторые существенные различия - например, в реализации Chrome отсутствует Promises.
Если вы настроили свой собственный узел обмена сообщениями для отправки правильно сформированной строки JSON, вам нужно будет опросить ее только один раз. Это означает, что вы можете использовать один вызов runtime.sendNativeMessage()
и будьте уверены, что ваши учетные данные являются приемлемыми. Пун намеревался.
Далее нам нужно посмотреть, как мы должны справиться с webRequest.onAuthRequired
событие.
Поскольку я работаю в Chromium, мне нужно использовать Chrome API без обещаний.
chrome.webRequest.onAuthRequired.addListener(
callbackFunctionHere,
{urls:[targetUrls]},
['asyncBlocking'] // --> this line is important, too. Very.
Изменение:
Я буду называть свою функцию provideCredentials
потому что я большой украл и использовал пример из этого источника. Ищите асинхронную версию.
Пример кода выбирает учетные данные из storage.local
...
chrome.storage.local.get(null, gotCredentials);
Мы этого не хотим. Нету.
Мы хотим получить учетные данные от одного звонка sendNativeMessage
поэтому мы изменим эту строку.
chrome.runtime.sendNativeMessage(hostName, { text: "Ready" }, gotCredentials);
Это все, что нужно. Шутки в сторону. Пока ваш Хозяин играет хорошо, это большой секрет. Я даже не скажу вам, сколько времени мне понадобилось, чтобы найти его!
Ссылки:
Мои вопросы с полезными ссылками:
- Здесь - Обходной путь для аутентификации против Active Directory
- Здесь - также есть некоторый рабочий код для функционального хоста NM
- Здесь - некоторые поучительные материалы по обещаниям
Так что это оказывается нетривиальной проблемой.
Я еще не реализовал решение, но я знаю, как туда добраться...
Передача значений в расширение является первым шагом - это можно сделать как в Chrome, так и в Firefox. Посмотрите версию, чтобы убедиться, что необходимый API-интерфейс nativeMessaging действительно существует в вашей версии. По этой причине мне пришлось перейти на хром.
Кроме того, можно использовать API хранилища, чтобы сначала поместить значения в хранилище браузера. [править: я не пошел по этому пути из соображений безопасности]
Далее следует использовать событие onAuthRequired из API webRequest. Настройте прослушиватель на событие и передайте нужные вам значения.
Предостережения: я собрал все вплоть до самого расширения для решения API nativeMessaging, и до сих пор существует проблема с получением сценария для распознавания данных. Это почти наверняка мои навыки JavaScript, противоречащие тайным знаниям, необходимым для того, чтобы эти API имели большой смысл... Мне еще предстоит попробовать метод хранения, так как он менее безопасен (на мой взгляд), но кажется, что он проще.