Запрос Curl с аутентификацией ntlm завершается ошибкой, если установлен пароль

Я пытаюсь получить некоторые данные из Microsoft Dynamics Nav WebService. Этот сервис использует аутентификацию NTML.

Если я открою URL-адрес веб-сервиса в браузере и использую данные учетные данные, все будет работать нормально.

Для настройки среды для клиента WebService я использовал командную строку, чтобы проверить, все ли работает нормально, в какой-то момент мне не удалось пройти аутентификацию.

Это команда, которую я использую:

curl --ntlm -u "DOMAIN\USERNAME" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"

Команда запросит пароль. Копирую пароль и все нормально.

Но когда я использую эту команду с уже включенным паролем, она перестает работать, и аутентификация не выполняется:

curl --ntlm -u "DOMAIN\USERNAME:PASSWORD" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"

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

Исследовать такого рода проблему очень сложно. Поиск проблем аутентификации curl + ntlm дает много результатов, но ничего не связано с этой конкретной проблемой.

Кто-нибудь из вас, ребята, уже сталкивался с такой проблемой?


person sbonath    schedule 25.08.2016    source источник


Ответы (3)


У меня возникла проблема с аутентификацией из-за файлов cookie. Я решил эту проблему, содержащую файлы cookie в txt-файле и используя именно этот файл во всех запросах. Например, после запроса на вход я сохранил эти файлы cookie:

curl -X POST -u username:password https://mysite/login -c cookies.txt 

И со следующим запросом я использовал этот файл следующим образом:

curl -X POST -u username:password https://mysite/link -b cookies.txt

Это решение сработало для меня, я не знаю, похожа ли ваша проблема, но, я думаю, вы можете попробовать это.

person Sviatlana    schedule 26.08.2016
comment
Возможно, проблема у меня описана немного слабо, но проблема не в том, что второй запрос требует другой аутентификации. Моя проблема в том, что как только я ввожу пароль в первоначальный запрос, аутентификация не выполняется. - person sbonath; 26.08.2016
comment
-c решил проблему, с которой я столкнулся по ОДНОМУ запросу. Я потратил большую часть 2 дней на отладку обмена NTLMSSP с использованием клиента Java и cURL, даже не принимая во внимание, что HTTP401 не имеет ничего общего с WWW-аутентификацией/авторизацией, а скорее с отсутствующим файлом cookie балансировки нагрузки (т.е. я нажимал несколько экземпляры IIS за обратным прокси-сервером балансировщика нагрузки во время последовательности запроса/вызова/ответа) - person jamey graham; 06.05.2019

Я долго боролся с подобной проблемой и, наконец, нашел этот отчет об ошибке curl #1253 Ошибка проверки подлинности NTLM, если пароль содержит специальные символы (символ британского фунта £) .

Аутентификация NTLM в cURL поддерживает только символы ASCII в паролях! Это все еще имеет место в версии 7.50.1 на Ubuntu, но я тестировал это на многих разных дистрибутивах, и это всегда одно и то же. Эта ошибка также нарушит функцию curl_init() в PHP (проверено на PHP7). Единственный способ решить эту проблему — избегать символов, отличных от ASCII, в паролях аутентификации NTLM.

Если вы используете Python, вам повезло. Очевидно, разработчики Python переписали реализацию cURL, и она работает с символами, отличными от ASCII, если вы используете пакет HttpNtlmAuth.

person Draco    schedule 20.03.2017

Попробуйте с флагом nltm.

Что-то вроде этого:

curl -v --proxy-nltm -u 'username:password' youproxy.com:8080 someURL


from > curl --help

 -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port
     --proxy-anyauth Pick "any" proxy authentication method (H)
     --proxy-basic   Use Basic authentication on the proxy (H)
     --proxy-digest  Use Digest authentication on the proxy (H)
     --proxy-negotiate Use Negotiate authentication on the proxy (H)
     --proxy-ntlm    Use NTLM authentication on the proxy (H)
person z atef    schedule 25.09.2020