php: переслать учетные данные ntlm в curl - PullRequest
5 голосов
/ 02 февраля 2012

У меня есть динамическая php-страница, которую мне нужно вызвать с параметром get. Затем я хочу поместить сгенерированный html в строку и использовать его позже (я пытаюсь настроить тонику для веб-сервисов)

Так что это похоже на PHP - Читать динамически сгенерированный (и отраженный) HTML в строку? , и я попробовал ответ, который использует cURL.

Проблема в том, что аутентификация выполняется с помощью ntlm (apache mod_auth_sspi). Сценарий php, выполняющий curl, уже аутентифицирован, например, его могут выполнять только действительные пользователи. Как-то можно передать эти "полномочия" в cURL? (имя пользователя доступно, но, конечно, не пароль)

Или совершенно другой подход тоже подойдет, но единственной идеей, которую я имел, было создание функции, которая создает строку с содержимым html.

$response = new Response($request);
$format = $request->mostAcceptable(array(
    'json', 'html', 'txt'
        ));

switch ($format) {

    case 'html':
        $response->addHeader('Content-type', 'text/html');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://localhost/viewRecord.php?identifier=' . $identifier);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
        $html = curl_exec($ch);
        curl_close($ch);
        $response->body = $html;
        break;
    //...   
}

Ответы [ 3 ]

6 голосов
/ 21 марта 2013

Мне удалось заставить это работать, добавив следующие параметры curl:

curl_setopt($curly[$id], CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($curly[$id], CURLOPT_UNRESTRICTED_AUTH, true);
curl_setopt($curly[$id], CURLOPT_USERPWD, ":");

В зависимости от версии php для этого открыта ошибка: https://bugs.php.net/bug.php?id=62195

1 голос
/ 11 февраля 2019

Вот что у меня сработало:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM|CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, true);
curl_setopt($ch, CURLOPT_USERPWD, "YOUR_USER:YOUR_PWD");
0 голосов
/ 12 февраля 2012

Ответ прост:

Это невозможно.

Обходной путь - поместить все файлы (включая php, JavaScript и CSS) в каталог, который не требует аутентификации NTLM.

Для достижения этого либо нужен доступ к Конфигурации Apache, и если это невозможно, единственное, на что вы можете надеяться, это то, что Конфигурация Apache позволяет переопределять SSPI в .htaccess. Разрешить любую аутентификацию (= также нет), но ограничить доступ 127.0.0.0, поскольку все запросы поступают от cURL на том же сервере.

Для авторизации вы можете поместить данные в сеанс php и передать cookie сеанса в cURL, а затем данные сеанса можно использовать для авторизации на странице, вызываемой из cURL.

EDIT:

Я существенно сократил использование NTLM еще больше. Теперь у меня есть 1 страница входа (аутентификация), а все остальное контролируется сессией php (авторизация). См

Apache2, PHP: создать страницу автоматического входа в систему ntlm

...