Все, що потрібно знати про apache basic authorization
Як це працює
Перш за все, ми кладемо на сервері файл .htaccess. У ньому ми вказуємо, яку зону (або конкретний файл) хочемо запароліть. Це може виглядати приблизно так:
Крім того, на сайті може бути присутнім файл паролів. У нього проста структура:
логін: зашифрований пароль
логін: зашифрований пароль
.
Шлях до цього файлу вказується в htaccess.
Розмова з сервером під збільшувальним склом
WWW-Authenticate: Basic realm = "My Realm"
Status: 401 Unauthorized
HTTP-Status: 401 Unauthorized
Тут потрібно сказати, що зона (realm) - важливий параметр. Якщо потрібно вести користувача через кілька запаролений зон, що не до всіх з яких користувач повинен мати доступ, то як раз ім'я зони буде визначати залягання користувач для цього місця або ще немає.
2. Отримавши ці заголовки, браузер малює на екрані форму запиту логіна і пароля. Якщо користувач натискає "Cancel", браузер видає все ті дані, що йшли за цими заголовками.
4. У разі, якщо користувач ввів вірні логін і пароль, а сервер відповів запитуваної сторінкою, браузер запам'ятовує введені логін і пароль для цієї зони.
5. Потім, якщо браузер посилає серверу будь-який (.) Запит, він прикріплює до нього пару - логін і пароль. Виглядає це так:
Authorization: Basic base64 (login: pass)
#Perl
print "WWW-Authenticate: Basic realm =" My Realm "\ n";
print "Status: 401 Unauthorized \ n";
print "HTTP-Status: 401 Unauthorized \ n";
print "Content-type: text / html \ n \ nCancel";
#PHP
header ( "WWW-Authenticate: Basic realm =" My Realm "");
header ( "Status: 401 Unauthorized");
header ( "HTTP-Status: 401 Unauthorized");
print "Ви натиснули Cancel";
Виникає утруднення: апач не передає змінних оточення введені логін і пароль. Тобто, отримати до них доступ з Perl проблематично. Але можливо. Найпростіше рішення - використовувати mod_rewrite. Допишите в файл htaccess рядки:
RewriteEngine onRewriteCond% ^ (. *)
RewriteRule ^ (. *) - [E = HTTP_CGI_AUTHORIZATION:% 1] Вони додадуть нову змінну оточення. З Perl вона буде видна як $ ENV. Вона буде містити пару логін-пароль, закодовану в base64. Звичайно, доведеться трохи повозитися з тим, щоб їх перекодувати назад, але це вже дещо. Тим більше, що метушні там, власне, не багато: s / basic \ s + // i;
my ($ REMOTE_USER, $ REMOTE_PASSWD) = split (/: /, decode_base64 ($ ENV));