Kapitola 17. HTTP autentikace a PHP

Prost°edky HTTP autentikace jsou v PHP p°φstupnΘ pouze pokud PHP b∞╛φ jako modul Apache, tudφ╛ nejsou p°φstupnΘ v CGI verzi. V PHP skriptu b∞╛φcφm pod modulem Apache lze pou╛φt funkci header() k odeslßnφ zprßvy "Authentication Required" klientskΘmu browseru, co╛ vyvolß zobrazenφ dialogovΘho okna pro vlo╛enφ u╛ivatelskΘho jmΘna a hesla. Jakmile u╛ivatel zadß jmΘno a heslo, URL obsahujφcφ tento PHP skript se zavolß znovu s prom∞nn²mi $PHP_AUTH_USER, $PHP_AUTH_PW and $PHP_AUTH_TYPE obsahujφcφmi jmΘno, heslo a typ autentikace. V souΦasnosti je podporovßna pouze "Basic" autentikace. Vφce informacφ viz funkce header().

Nßsledujφcφ fragment k≤du m∙╛e poslou╛it jako ukßzka vy╛ßdßnφ autentikace u╛ivatele na strßnce:

P°φklad 17-1. Ukßzka HTTP Autentikace

<?php
  if(!isset($PHP_AUTH_USER)) {
    Header("WWW-Authenticate: Basic realm=\"My Realm\"");
    Header("HTTP/1.0 401 Unauthorized");
    echo "Text, kter² se ode╣le, pokud u╛ivatel zmßΦkne tlaΦφtko Cancel\n";
    exit;
  } else {
    echo "Ahoj $PHP_AUTH_USER.<P>";
    echo "Jako heslo jsi zadal $PHP_AUTH_PW.<P>";
  }
?>

Mφsto protΘho vyti╣t∞nφ $PHP_AUTH_USER a $PHP_AUTH_PW byste asi cht∞li ov∞°it platnost zadanΘho jmΘna a hesla. Nap°φklad dotazem v databßzi nebo vyhledßnφm u╛ivatele v dbm souboru.

Pozor na chybovΘ browsery Internet Explorer. Zdß se, ╛e jsou velice vybφravΘ, pokud jde o po°adφ hlaviΦek. Zdß se, ╛e odeslßnφ hlaviΦky WWW-Authenticate p°ed hlaviΦkou HTTP/1.0 401 zabφrß.

Aby se zabrßnilo psanφ skript∙ odhalujφcφch hesla na strßnkßch autentikovan²ch n∞kter²m z tradiΦnφch externφch mechanism∙, PHP_AUTH prom∞nnΘ se nevytvo°φ, pokud je pro tu kterou strßnku zapnuta externφ autentikace. V takovΘm p°φpad∞ m∙╛ete k identifikaci extern∞ autentikovanΘho u╛ivatele pou╛φt prom∞nnou $REMOTE_USER.

V╣imn∞te si nicmΘn∞, ╛e v²╣e uvedenΘ nezabrßnφ krßde╛φm hesel z autentikovan²ch URL osobou, kterß ovlßdß neautentikovanou URL na stejnΘm serveru.

Jak Netscape, tak Internet Explorer po p°ijetφ response k≤du 401 vyprßzdnφ autentikaΦnφ cache souΦasnΘho realmu. Tak m∙╛ete u╛ivatele v podstat∞ "odlogovat". N∞kte°φ lidΘ toho vyu╛φvajφ k "vypr╣enφ" p°ihlß╣enφ nebo tvorb∞ odhla╣ovacφho tlaΦφtka.

P°φklad 17-2. Ukßzka HTTP autentikace vy╛adujφcφ novΘ jmΘno a heslo

<?php
  function authenticate() {
    Header( "WWW-Authenticate: Basic realm=\"Test Authentication System\"");
    Header( "HTTP/1.0 401 Unauthorized");
    echo "K p°φstupu na tento zdroj musφte zadat platnΘ ID a heslo\n";
    exit;
  }
 
  if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) {
   authenticate();
  }
  else {
   echo "Welcome: $PHP_AUTH_USER<BR>";
   echo "Old: $OldAuth";
   echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
   echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n";
   echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n";
   echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n";
   echo "</FORM>\n";
  }
?>

Podle standardu HTTP Basic authentication se toto chovßnφ nevy╛aduje, tak╛e byste na to nikdy nem∞li spolΘhat. Pokusy s Lynxem ukßzaly, ╛e Lynx po p°ijetφ response k≤du 401 nevyprßzdnφ autentikaΦnφ ·daje, tak╛e po stisknutφ back a forward se znovu ukß╛e po╛adovan² zdroj (pokud se nezm∞nily po╛adavky na ·daje).

Dßle si v╣imn∞te, ╛e tato vlastnost p°i pou╛itφ IIS serveru a CGI verze PHP dφky omezenφm IIS nefunguje.