L'exemple D'authentification HTTP de PHP Digest ne fonctionne pas, pourquoi?
J'ai donc décidé d'utiliser l'authentification HTTP digest pour mon API REST. Je l'ai googlé et trouvé une entrée dans le manuel PHP avec un exemple de comment le faire. Donc je copie le script, je le mets dans index.php sur mon serveur, ouvrez la page dans le navigateur, après avoir entré mes justificatifs d'identité, le navigateur me les demande à nouveau et je suis coincé dans une boucle infinie de saisie de justificatifs d'identité. Le script est inclus ci-dessous et peut être trouvé ici.
exemple # 7 Digest authentification HTTP exemple
<?php
$realm = 'Restricted area';
//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
die('Text to send if user hits Cancel button');
}
// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Wrong Credentials!');
// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response)
die('Wrong Credentials!');
// ok, valid username & password
echo 'Your are logged in as: ' . $data['username'];
// function to parse the http auth header
function http_digest_parse($txt)
{
// protect against missing data
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));
preg_match_all('@(' . $keys . ')=(?:(['"])([^]+?)|([^s,]+))@', $txt, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}
return $needed_parts ? false : $data;
}
?>
j'ai aussi essayé l'authentification de base et cela a parfaitement fonctionné.
exemple #6 authentification HTTP de base exemple
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>
Il semble que $_SERVER['PHP_AUTH_DIGEST']
est toujours vide.
y a-t-il quelque chose qui ne va pas avec le script ou mon environnement est-il funky et si oui, comment puis-je le corriger?
EDIT: Il n'y a rien de mal avec le script. La faute du serveur. Si quelqu'un si vous savez ce qui pourrait causer ça, dites-le-moi.
2 réponses
Digest authentication est un module Apache séparé qui n'est souvent pas installé sur les serveurs - en particulier avec les entreprises d'hébergement bon marché. Il doit être permis d'en faire usage.
http://httpd.apache.org/docs/current/mod/mod_auth_digest.html
Cela dépend de votre distribution comment l'installer, si vous utilisez Linux. Sur mon Ubuntu Linux il suffisait de créer un lien symbolique du module à partir du dossier modules désactivés vers le modules activés un exécuter sudo a2enmod auth_digest
sur la coque. Ça, et redémarrer Apache, bien sûr.
je ne sais pas à propos de Windows.
vous avez mod_headers chargé dans Apache (je suppose que votre serveur Apache)?
Vous pouvez trouver en utilisant la ligne de commande suivante (où l'exécution peut exiger des privilèges):
httpd -M | grep head