2010/08/02

Базовая авторизация, винды, пых и соломинка, или Немного программерского трипа из ничего

...Волна и камень,
Стихи и проза, лед и пламень
Не столь различны меж собой.
(c) Наше почти что всё

Базовая авторизация сцуко хитрая. Вот казалось бы, принципы и технологии отработаны не один десяток лет, ан нет, и тут не без прикола.
Всем известен такой (или примерно такой) код:

if ( isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']) )
{
//здесь работаем
} else {
//здесь авторизуем
header('WWW-Authenticate: Basic realm="pedo mellon a minno"');
header('HTTP/1.1 401 Unauthorized');
print 'bad idea';
die;
}
и как он должен работать, тоже все представляют: появляется окошечко с надписью, туда вбиваем логин\пароль, жмём ентер, опач выставляет заголовки $_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW'], мы их ловим в коде, всё ништяк.
Не тут-то было.

Пункт "а"; то бишь "о" - Опера.
Опера - как конфета, как старая карамелька: сверху красивая, внутри пустая. С ней много и очень много приколов. К примеру, пара: Опера не отправляет заголовки авторизации и вышеприведённый код сразу переходит на строку print 'bad idea'; Точнее будет сказать, не отправляет с первого раза - жмём F5 и ВНЕЗАПНО получаем авторизованного юзера.
Вторая забавность даже не в том, что "дебагер"-дом-инспектор (ну, как файрбаг в фф) работает через сторонний сервер (да-да, о_О нет коннекта - нет инспекта), а в том, как он визуально организован. Можно перемещаться стрелочками, но нельзя стрелочками же раскрыть ветку; также не работают комбинации Ctrl+Arrow, Ctrl+PgUp\PgDn, Ctrl +\-... Короче, сумрачный оперный проектировщик интерфейсов навесил тоггле-коллапсинг на Enter. Поувольнял бы.

Пункт "х"; Хромой и клоны, возвращаемся к авторизации.
Не буду долго томить, скажу сразу. Заголовок header('HTTP/1.1 401 Unauthorized'); хрому не указ. Не то чтоб совсем... Но как-то неадекватно он себя ведёт: не каждый раз изволит показать модальное окно, отслеживая по каким-то своим хитрым алгоритмам активность юзера и отправляя заголовки минуя ввод логина.
Не верите - проверяйте сами. До меня это дошло за много, много часов.

А глубинах этого сурового трипа поджидала внутренняя малая игра: "переставь мускуль на винде" ;)
Началась она с того, что php5.3 не увидел mysql5.1. Одинаковый mysql_connect('localhost','login','password'); на пыхе 5.2 (оставил-таки себе ;) коннектит, а на 5.3 даёт
Warning: mysql_connect(): [2002] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера
и вылетает по таймауту в 30 секунд. Вот здесь скорость отъезда крыши начала приближаться к световой и воображаемые друзья начали казаться не такими уж и воображаемыми. Пока они сейшенили, я решил немного вздремнуть.

После чего был проверен и перепроверен мускуль, пых, переставлен мускуль на более новый, потому что грамотно обновляться виндовые версии до сих пор не научились. Результата ноль.

Секретный секрет заключался в том, что пых5.3 не резолвит localhost. Ибо в замечательной системе Windows Vista в известном файле hosts строка localhost 127.0.0.1 закоменчена. Ну вы поняли. Спасибо Безумному доктору http://drcreazy.com/art/8


Ах да, зачем мне всё это было надо? После беседы с Коджи я так восхитился ;) их движком, что решил написать своё поделие. Ещё один кусок набора веб-инструментов называется "Web Mysql Console". Смотреть здесь http://code.google.com/p/angry/source/browse/#svn/tags/WebMysqlConsole

Такой вот получился трип вместо нескольких часов простого кода

blog comments powered by Disqus