Autentificare HTTP cu php

Despre PHP, MySQL, HTML, C++, VB, JAVA etc.

Moderator: Moderatori

Post Reply
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Autentificare HTTP cu php

Post by caraboy »

Am urmatorul script php pentru a permite accesul unui utilizator pe o pagina cu autentificare de tip HTTP:

Code: Select all


    function authlogin( $sent_user='', $sent_password='', $login_message='' ) { 

        global $auth_user;
        global $auth_password;

        if ( ! $login_message ) { 
            $login_message = "Autentificare sectiune administrare";
        }

        if ( $sent_user && $sent_password ) { 
             $auth_user = $sent_user;
             $auth_password = $sent_password; 
        }

        $entered_user = $_SERVER['PHP_AUTH_USER'];
        $entered_password = $_SERVER['PHP_AUTH_PW'];

        if (!isset($entered_user)) {

            header("WWW-Authenticate: Basic realm=\"$login_message\"");
            header("HTTP/1.0 401 Unauthorized");

            login_error();
        }
        else {

            //testeaza user si pass
            if( $entered_user == $auth_user && $entered_password == $auth_password ) {
               return;
            }
            else {
               
                header( "WWW-Authenticate: Basic realm=\"$login_message\"");
                header("HTTP/1.0 401 Unauthorized");
                login_error( );
            }
        } 

    }

    function logout() 
	{ 
       unset($_SERVER['PHP_AUTH_USER'] ); 
       unset($_SERVER['PHP_AUTH_PW'] );
       unset($_SERVER['HTTP_AUTHORIZATION']);
	   session_start();
       session_unset();
       session_destroy();
       echo "Sesiune curatata";
       exit;
    }

    function login_error() {
       echo "Nu aveti acces";
       exit;
    }  
Apelez scriptul in header de forma authlogin(user_de_verificat, parola_de_verificat, mesaj_realm); si daca parola si user-ul corespund, permit accesul. Care este problema: pentru a sterge user-ul si pass-ul (deci pentru a face logout) folosesc functia logout in care dau unset la variabilele $_SERVER['PHP_AUTH_USER'] si $_SERVER['PHP_AUTH_PW'] pentru a cere din nou user si pass (am pus si session_unset si destroy, just in case). Problema e ca nu merge, desi functia se apeleaza, afiseaza Sesiune curatata, eu tot pot accesa pagina respectiva daca o tastez in browser. Trebuie sa inchid browser-ul si sa-l repornesc. Care este buba? #-o
User avatar
r4zv4n
Posts: 2960
Joined: Tue May 04, 2004 12:12 am

Post by r4zv4n »

Nu ştiu PHP, dar ce descrii tu acolo îmi sună a problemă de browser caching.

În ASP poţi seta ca o anumită pagină să nu intre în cache (i.e. să expire imediat). Caută o asemenea directivă şi în PHP şi vezi dc îţi rezolvă problema.
Sunt foarte misterios. De multe ori nici eu nu ştiu ce fac.
Mood: "I can't help but feeling that love is always dealing me a losing hand" (Deep Dish - "Sacramento")

Image
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Tot nu merge. #-o Am adaugat header('Pragma: no-cache'); in header, in fisierul care include scriptul de autentificare si tot nu merge. :(
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Am rezolvat partial problema cu adaugarea in header-ul care e inclus in fiecare pagina de administrare a codului:

Code: Select all

header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
De ce partial? Pentru ca FireFox tot tine minte sesiunea, desi primeste header-ele de no-cache. #-o E prima data cand IE nu-mi face probleme. :tongue3: Idei? :-~
User avatar
iLogiK
Posts: 3189
Joined: Tue Aug 12, 2003 11:37 pm

Post by iLogiK »

o cautare pe google da cateva rezultate printre care si

Code: Select all

Header( "Last-Modified: " . gmdate( "D, j M Y H:i:s" ) . " GMT" );
Header( "Expires: " . gmdate( "D, j M Y H:i:s", time() ) . " GMT" );
Header( "Cache-Control: no-store, no-cache, must-revalidate" );  // HTTP/1.1
Header( "Cache-Control: post-check=0, pre-check=0", FALSE );
Header( "Pragma: no-cache" );                          // HTTP/1.0
incearca asa
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Tot de pe google am luat si eu. :)) Nimic.. mai rau, in IE, in fiecare pagina care include chestia de autentificare imi cere user si pass. :)) Da, cred ca trec pe sesiuni, ca nu e o solutie chestia asta. :(
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Nu-mi dau seama cum au rezolvat cei de la phpMyAdmin.. acolo merge fara probleme HTTP auth.
User avatar
Morrison
Posts: 210
Joined: Thu Dec 30, 2004 6:43 pm

Post by Morrison »

Grupul utilizatorilor seriosi de Instant Messaging saluta Google Talk
http://www.google.com/talk
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Crezi ca nu m-am uitat acolo... :wink: De acolo m-am inspirat si pentru script. Dar problema e cachingul de la firefox! Am folosit sesiuni pana la urma. :tongue3:
User avatar
Morrison
Posts: 210
Joined: Thu Dec 30, 2004 6:43 pm

Post by Morrison »

Eehh am incercat si io :sad1:
Grupul utilizatorilor seriosi de Instant Messaging saluta Google Talk
http://www.google.com/talk
User avatar
whiskey
Posts: 1435
Joined: Tue May 27, 2003 1:30 pm

Post by whiskey »

Inlocuieste in functia de logout:

Code: Select all

unset($_SERVER['PHP_AUTH_USER'] ); 
unset($_SERVER['PHP_AUTH_PW'] ); 
unset($_SERVER['HTTP_AUTHORIZATION']);
cu:

Code: Select all

header("HTTP/1.0 401 Unauthorized");
Teoretic ar trebui sa functioneze. Cred. Daca merge, afla ca tot manualul PHP te ajuta :)
User avatar
caraboy
Posts: 1598
Joined: Sun Feb 23, 2003 3:43 pm

Post by caraboy »

Nu merge. Ca am mai multe pagini de navigare si tot se retine sectiunea. :) Am rezolvat cu sesiuni. Am consultat si manualul, nu m-a ajutat. :)
User avatar
SmileX
Posts: 616
Joined: Tue Sep 14, 2004 9:36 pm

Post by SmileX »

nu e mai usor daca folosesti sesiuni?
User avatar
whiskey
Posts: 1435
Joined: Tue May 27, 2003 1:30 pm

Post by whiskey »

E mai usor daca folosesti sesiuni, intr-adevar, dar numai daca ai nevoie de ele (nu pentru protejarea paginilor - de!, poate nu am inteles eu rolul sesiunilor; oricum privesc altfel lucrurile) si, mai ales, daca stii sa le folosesti :tongue3:. Daca nu ma insel, antetul respectiv goleste variabilele (recte trimete un raspuns browserului cum ca utilizatorul nu e autorizat si, teoretic, ar trebui sa goleasca variabilele). Eventual poti face o chestie de genul $var = ''. Dar nu am incercat si, deci, nu bag mana in foc ca functioneaza. Nu am incercat pentru ca am alta solutie. Dar vad ca te descurci si asa :thumbleft:
Post Reply