Newsgroup: it.comp.www.php
Titolo: Autenticazione Http

Sono un newbie, ma sto studiando forte.
Mi scuso se la domanda è banale, ma sono circa 6 ore che ci studio sopra e 
non vado avanti ...
Vorrei usare l'autenticazione HTTP, e come da tutorial PHP ho usato il 
codice (qui semplificato) che segue:
<?
$user = "demo";
$pass = "demo";
if (!isset($_SERVER['PHP_AUTH_USER']))
{
header("WWW-Authenticate: Basic realm=\"Effettua il Login!\"");
Header("HTTP/1.0 401 Unauthorized");
exit;
}
else if(($_SERVER['PHP_AUTH_USER']==$user) && 
($_SERVER['PHP_AUTH_PW']==$pass))
{
echo "Complimenti! Ti sei loggato con successo...";
}
else
{
echo "Errore!";
}
?>
Benissimo, funziona, salvo aggiustamente e ovviamente estrarre user e pass 
da una tabella di utenti "abilitati" per confrontarli con quelli immessi.
Il problema:
Se il login e la password passati sono sbagliati (per esempio l'utente ha 
sbagliato la battitura) l'unico modo che ho per poter riproporre la maschera 
di richiesta è chiudere e riaprire il browser.
Ragazzi io c'ho provato a cercare in rete ed anche a googlare sul Ng, ma la 
soluzione non l'ho trovata.
Come faccio per resettare $_SERVER['PHP_AUTH_USER in modo che il "if (!isset 
... " me la trovi libera e faccia partire la maschera di richiesta ?
Rick 

... " me la trovi libera e faccia partire la maschera di richiesta ?
Non puoi. Pero' se restituisci uno header 401, il browser DOVREBBE capirlo
e chiedere nuovamente, mostrando di nuovo la maschera di richiesta. Quindi
ti basta, forse, sostituire echo("Errore") con Header("HTTP/1.0 401...").
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

 ti basta, forse, sostituire echo("Errore") con Header("HTTP/1.0 401...").
Ho provato, ma non sortisce effetto, nel senso che la finestra non viene 
riproposta, prende il login che è già settato, lo confronta, lo trova 
sbagliato e l'utente stà li a fare reload reload ...
Allora ho fatto questo:
----------------------------- inizio codice
<?php
include("config.inc.php");
  if (!isset($_SERVER['PHP_AUTH_USER']) or $HTTP_GET_VARS[sbagliato]=="1")
   {
    header('WWW-Authenticate: Basic realm="Inserire login e password per 
accedere"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Per accedere deveno essere inseriti un username ed una password 
autorizzati';
    exit;
   }
 $db = mysql_connect($db_host, $db_user, $db_password);
 if ($db == FALSE)
  die ("Errore nella connessione. Verificare i parametri nel file 
config.inc.php");
 mysql_select_db($db_name, $db)
 or die ("Errore nella selezione del database. Verificare i parametri nel 
file config.inc.php");
 $query ="SELECT pw,
 abilita
 FROM users
 WHERE uid=\"{$_SERVER['PHP_AUTH_USER']}\"";
 $result = mysql_query($query, $db);
 $row = mysql_fetch_array($result);
if ("{$_SERVER['PHP_AUTH_PW']}"==$row[pw])
 {
 echo "<p>Ciao {$_SERVER['PHP_AUTH_USER']}.</p>";
 echo "<p>Hai inserito {$_SERVER['PHP_AUTH_PW']} come tua password.</p>";
 echo "<p>La password corretta era $row[pw].</p>";
 echo "<p>Sei abilitato al livello $row[abilita]</p>";
   }
else {
   echo "<p>Login e password non riconosciuti</p>";
   echo "<form action=\"autentica.php\" METHOD=GET>";
   echo "<input type=hidden name=\"sbagliato\" value=\"1\">";
   echo "<input type=submit value=\"Riprova\">";
   echo "</form>";
 }
?>
----------------------------- fine codice
Beh ... in pratica funziona nel senso che con sbagliato = 1 viene riproposta 
la finestra di richiesta di login e password, però in questo caso non riesce 
a riconoscere che ho scritto qualcosa, o meglio mi presenta tre volte la 
finestra (qualsiasi cosa io scriva, giusta o sbagliata o lasciando uid e pw 
vuoti) e poi mi manda il messaggio come se avessi premuto cancel ('Per 
accedere deveno essere inseriti un username ed una password autorizzati').
Insomma sembrerebbe non accettare i nuovi dati immessi ...
Se invece i dati sono giusti alla prima botta (prima di andare al form) 
tutto funziona...
Rick

 ha scritto nel messaggio 
news:d5lru8$bc9$1...@area.cu.mi.it...


 unset $_SERVER['PHP_AUTH_USER'] ???
Prima no, ora si con
 unset ($_SERVER['PHP_AUTH_USER']);
... ma non funziona ...
Rick 

di richiesta è chiudere e riaprire il browser.
In questo caso, se login e password sono ESATTI, non ti puoi piu' sloggare
per rientrare con un diverso utente perche' il browser ripropone i dati di
cui e' gia' in possesso. In questo caso occorre forzare un errore ANCHE se
login e password sono esatti; la soluzione e' simile a quella che hai gia'
trovato:
	if (isset($_REQUEST['logout']))
		$ok = false;
...e qui ti ritrovi con il problema che devi eliminare quel "logout" dalla
request, altrimenti ti rimane li' e non ti logghi piu', finche' non chiudi
il browser (che IMHO infatti e' la meglio).
Lo so: e' un casino :-)


 Lo so: e' un casino :-)
Minchia ! :-)
Rick 

                Header("HTTP/1.0 401 Unauthorized");
Prima hai verificato che non manchi almeno una tra login e pw, poi di non 
possedere (tramite precedente login) lo user e la pw corretti.
Benissimo, è chiaro.
Alla fine, se e solo se le verifiche hanno esito negativo, fai comparire la 
maschera di richiesta.
Ma a quel punto dov'e' che fai la verifica che user e pw siano coerenti con 
le verifiche che avevi fatto prima ?
Eppure funziona, quindi c'e' qualcosa che io non ho capito su header.
Come funziona questo header ? Fa virtualmente ricaricare la pagina in modo 
che ripassa attraverso i controlli ?
Grazie in anticipo :-)
Rick 

che ripassa attraverso i controlli ?
Si', solo che non lo fa virtualmente, succede davvero :-)


 Leonardo
Chiarissimo ! Grazie mille !
Rick