Использование curl для получения информации о странице MediaWiki через перенаправления SSO

tl;dr: HTTP-запрос к URL работает через Chrome и Firefox, но не работает при использовании curl.

Подробности:

Моя компания использует MediaWiki для внутренней вики-страницы. Мое приложение успешно использовало cURL для получения информации о страницах с помощью этой команды:

curl -s -k -u "username:password" "https://wiki.intranet/mainwiki/api.php?action=query&titles=SomePage&prop=info&format=xml"

Однако ИТ-отдел недавно изменил вики, чтобы использовать какую-то систему единого входа. Если я сейчас запрошу этот URL-адрес, я получу серию перенаправлений HTTP 302, проходящих через следующие местоположения:

  • /sso?request_uri=/mainwiki/api.php?action=query&titles=SomePage&prop=info&format=xml
  • http://wiki.intranet/sso/?request_uri=/mainwiki/api.php%3faction=query&titles=SomePage&prop=info&format=xml
  • https://wiki.intranet/sso/?request_uri=/mainwiki/api.php%3faction=query&titles=SomePage&prop=info&format=xml

Когда я запрашиваю этот последний URL-адрес с помощью cURL, я получаю от сервера ответ 400 (неверный запрос). С параметром -I для отображения заголовков, вот он:

> curl -S -k -I -u "username:password" "https://wiki.intranet/sso/?request_uri=/mainwiki/api.php%3faction=query&titles=SomePage&prop=info&format=xml"
HTTP/1.1 400 Bad Request
Date: Wed, 29 Apr 2015 20:47:49 GMT
Server: Apache/2.2.3 (CentOS)
Connection: close
Content-Type: text/html; charset=iso-8859-1

Однако, когда я запрашиваю тот же URL-адрес с помощью Google Chrome, я вижу нужные мне результаты!

Как получить информацию с помощью curl?


Изменить: когда я запрашиваю исходный URL-адрес с помощью Firefox, он также выполняет те же перенаправления, а затем показывает мне два статуса 401 (требуется авторизация). Когда я заполняю имя пользователя/пароль в Firefox, он проводит меня через другое перенаправление обратно к исходному URL-адресу, и в этот момент он получает ответ со статусом 200 с XML, который я хочу .


person Phrogz    schedule 29.04.2015    source источник
comment
О, и я попробовал этот конечный URL-адрес, заменив & на %26 на случай, если сервер Apache, обрабатывающий запрос, каким-то образом захлебнется от этого. Тот же результат 400.   -  person Phrogz    schedule 30.04.2015
comment
Это похоже на проблему с системой SSO вашей компании, а не с самой MediaWiki. Увы, это, вероятно, также означает, что на него нельзя ответить без дополнительной информации о реализации SSO.   -  person Ilmari Karonen    schedule 30.04.2015


Ответы (1)


Наконец, это заработало, добавив следующее:

curl -s -k-L --ntlm -c cookies.txt-u "user:pass" "originalurl"

Обратите внимание, что на некоторых страницах предлагается использовать -u : в Windows для передачи учетных данных. Мне это не помогло.

Это работало с использованием следующей версии curl в Windows:

c:\> curl --version
curl 7.36.0 (x86_64-w64-mingw32) libcurl/7.36.0 OpenSSL/1.0.1c zlib/1.2.8
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: Largefile NTLM SSL libz TLS-SRP
person Phrogz    schedule 29.04.2015
comment
руководство пользователя — ваш друг: Если вы используете curl с поддержкой SSPI двоичный файл и выполнить аутентификацию NTLM, вы можете заставить curl получить имя пользователя и пароль из вашей среды, просто указав одно двоеточие с этой опцией: -u : Как вы можете видеть из вывода --version, curl Используемый вами двоичный файл был собран без поддержки SSPI. - person Tgr; 30.04.2015