PHP_AUTH_USER et FastCGI
Ecrit par Red
Mercredi, 21 Janvier 2009 20:04
Lorsque vous voulez utiliser les fonctions d'authentification HTTP de PHP en mode CGI (ou FastCGI)  les variables PHP_AUTH_USER, PHP_AUTH_PWD et AUTH_TYPE ne sont pas rensignée.
Pour contourner le problème il faut :
Créer ou ajouter ces lignes dans un fichier .htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule> 

En clair cette règle assigne l'entête HTTP d'authentification à une variable d'environnement HTTP_AUTHORIZATION.

Ensuite, voici la source PHP qui permet d'utiliser  PHP_AUTH_USER et PHP_AUTH_PW : 

<?php
// sur mon serveur, bien que dans le .htaccess la variable d'environnement qui 
// reçoit les infos d'authentification s'appelle HTTP_AUTHORIZATION, la variable 
// affichée est REDIRECT_HTTP_AUTHORIZATION, un grand mystère... mais bon....
if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];

// les donnèes d'authentification sont dans HTTP_AUTHORIZATION encodées en base64 
// donc il faut les décoder et les extraire
if(isset($_SERVER['HTTP_AUTHORIZATION']))
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));

// a ce stade on se retrouve dans la même configuration que PHP en module
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo "L'utilisateur a annulé l'authentification";
exit;
} else {
echo "<p>Bonjour, </p>".$_SERVER['PHP_AUTH_USER'];
echo "<p>Le mot de passe entré: </p>".$_SERVER['PHP_AUTH_PW'];
}
?>