Помогите с NTLM авторизацией

SiZE

Новичок
Помогите с NTLM авторизацией

Прочитал тут http://phpclub.ru/faq/NTLM. Но это не то, что надо для меня.

Есть задача: получать с помощью GET запросов данные на сайте. Сайт расположен на отдельном компьютере под управлением Windows, в качестве сервера используется IIS. Для того что бы открыть какую либо страницу на сайте надо пройти авторизацию.

Не большое примечание: через браузер сайт открывается быстро, если я лезу скриптом, то очень долго жду ответа, минуты 1,5 две на 1 страницу. Скрипт использует fsockopen, я пока не знаю с чем это связано.

Как все это выглядит в браузере: я открываю URL, скажем 127.0.0.1/pas. Всплывает окно (похожее на HTTP-аутенфикацию), авторизация не руками написанная, а серверная (логин и пароль прописаны в домене), я ввожу логин и пароль, далее меня перекидывает на сайт http://127.0.0.1/pas/en/site/index.php

Как это выглядит если использовать заголовки HTTP:
1. Я посылаю GET /pas HTTP/1.1
2. Сервер говорит, что я не авторизован возвращает:
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="127.0.0.1"
3. На данном этапе я научился проходить 'Basic' авторизацию. Отправляю просто: "Authorization = Basic ".base64_encode ($login.":".$passwd)."\r\n"; Посмотрел в фаербаге, браузер авторизуется через NTLM. Может быть из-за этого когда я запускаю скрипт проходит минуты 2-3 прежде чем я вывод на экран получаю? Т.е. из-за разных видов авторизации время ожидания увеличивается, скажем если это Basic то компу приходится где нибудь что нибудь дополнительно искать и тд?

Как правильно авторизоваться с помощью NTLM на сервере? Я в криптографии не силен, помогите, как там хеши составляются?
 

SiZE

Новичок
DiMA, спасибо! Замена Keep-alive на Close существенно уменьшило время ожидания с 2 минут до 0,2 секунд :) Но я чуть чуть поколупался и решил проблему с Keep-alive. Вместо стандартного мануаловского запроса:

PHP:
fwrite ($fp, $out);
while (!feof($fp)) {
   echo fgets ($fp, 128);
}
fclose ($fp);
Я написал такой:

PHP:
fwrite ($fp, $out);
$res = fread ($fp, 4096);
теперь летает. Осталось выяснить, как правильно авторизоваться, если сервер поддерживает NTLM (не через Basic). Как создать хеш, как использовать возвращаемый сервером ключ и еще что не знаю может быть там?
 
Сверху