Как подключиться к HTTP Rest API, который аутентифицируется с помощью LDAP

Я пишу скрипт Ruby для подключения к веб-сайту REST API. Веб-сайт аутентифицируется с помощью LDAP / SSO с использованием учетных данных AD, поэтому не требуется никакой базовой аутентификации или пользователя/пароля.

Это код до сих пор:

resource_http = Net::HTTP.new(webserver.company.com, 443)
resource_http.use_ssl = true
resource_http.verify_mode = OpenSSL::SSL::VERIFY_NONE
resource_request = Net::HTTP::Post.new("/api/endpoint")
resource_request.set_form_data({"chocolate"=>"yes","beer"=>"yes"})
resource_response = resource_http.request(resource_request)

Но получаю ошибку авторизации:

Net::HTTPUnauthorized 401 Authorization Required

Играя с Net::LDAP, я могу аутентифицировать свои учетные данные на своем компьютере:

ldap = Net::LDAP.new
ldap.host = "ldap.company.com"
ldap.port = "389"
ldap.auth "[email protected]", "password"
ldap.bind

Но я понятия не имею, как «прикрепить» или передать эту информацию LDAP в HTTP-запросе.

Все мои поисковые запросы в Google указывают на включение единого входа/аутентификации в приложении веб-сайта, но я не пытаюсь этого сделать, я хочу подключиться с помощью своего скрипта Ruby к существующему веб-сайту, прошедшему проверку подлинности LDAP.

Обновление №1. Некоторые форумы Ruby указали мне на HTTPI gem и использование адаптера 'curb'. Этот адаптер использует библиотеку Curl для обработки проверки подлинности Kerberos/SPNEGO. Однако мне не удалось заставить установщик curb работать с библиотекой curl, на которую они ссылаются на своем веб-сайте (для компьютера с Windows).

Я перенес код на Python с помощью модуля kerberos. Я могу сгенерировать билет и добавить его в заголовки HTTP-запроса, которые проходят аутентификацию с помощью REST API и возвращают нужные мне данные.

Я все еще учусь, поэтому, даже если мой код работает на Python, я бы хотел, чтобы он работал на Ruby.

Пример кода на Python: https://gist.github.com/DevOpsCow/d374300304d7beef8a03


person Moo    schedule 03.02.2016    source источник
comment
Добро пожаловать в Stack Overflow. Вот небольшой совет: не говорите, что это глупый вопрос, а затем призывайте нас быть мягче. Задавайте хорошие вопросы, убедитесь, что вы провели исследование и предоставили необходимую информацию. meta.stackoverflow.com/q/261592/128421 и tinyurl.com/stack-hints и catb.org/esr/faqs/smart-questions.html хорошо читать.   -  person the Tin Man    schedule 04.02.2016


Ответы (3)


Существует множество способов передачи учетных данных по HTTP. Я был бы удивлен, если бы REST API позволял вам передавать информацию о хосте/порте вашего сервера LDAP (это может быть огромной дырой в безопасности). Наиболее вероятный сценарий заключается в том, что вам нужно указать имя пользователя и пароль в форме, которую ожидает REST API. Затем REST API выполнит аутентификацию на сервере LDAP, и в зависимости от результатов аутентификации вы получите соответствующий ответ/статус от REST API.

Короче говоря, вам нужно получить информацию от администратора REST API (или из документации API), чтобы узнать, как вы должны проходить аутентификацию через HTTP.

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

person Bertold Kolics    schedule 04.02.2016

Когда вы получаете 401 Authorization required, сервер также должен предоставить www-authenticate-заголовок, который содержит дополнительную информацию о том, как пройти аутентификацию. Посмотрите на это и проверьте предоставленную информацию.

person heiglandreas    schedule 04.02.2016

Я не знаю, поможет ли это, я пытался использовать почтальона для отправки аутентификации через API, который использует LDAP. Один из разработчиков оружия, с которым я работаю, помог мне, в итоге мне пришлось использовать DOMAIN\username в поле имени пользователя. Это сработало после этого.

person PvO    schedule 22.02.2019
comment
Может быть, показать здесь какой-нибудь фрагмент кода? - это поможет другим понять это более ясно. - person Tiw; 22.02.2019