php: перенаправить учетные данные ntlm в curl

У меня есть динамическая 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;
    //...   
}

person beginner_    schedule 02.02.2012    source источник


Ответы (3)


Я смог заставить это работать, добавив следующие параметры завитка:

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

person Rob Dawley    schedule 21.03.2013
comment
давным-давно. Только помните, что я просто не смог заставить его работать без явной установки userpwd. Но, может быть, я просто сделал что-то не так. Во всяком случае, теперь у меня есть только 1 страница (страница входа) под управлением NTLM. Отдых по сеансу php. См. ссылку в редактировании выше. Лично я думаю, что это в любом случае лучше, потому что тогда легко изменить механизм аутентификации. - person beginner_; 21.03.2013
comment
Это не работает для меня. Обратитесь к моему ответу: stackoverflow .com/questions/9111705/ - person Wolfack; 11.02.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");
person Wolfack    schedule 11.02.2019

Ответ прост:

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

person beginner_    schedule 12.02.2012