Skip to content

Instantly share code, notes, and snippets.

@heanfig
Created April 9, 2018 22:19
Show Gist options
  • Save heanfig/d5aac84ee4d92d4437c115a5919e116d to your computer and use it in GitHub Desktop.
Save heanfig/d5aac84ee4d92d4437c115a5919e116d to your computer and use it in GitHub Desktop.
<?php
$dominio = 'Area restringida';
// usuario => contraseña
$usuarios = array('admin' => 'micontraseña', 'invitado' => 'invitado');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$dominio.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($dominio).'"');
die('Texto a enviar si el usuario pulsa el botón Cancelar');
}
// Analizar la variable PHP_AUTH_DIGEST
if (!($datos = analizar_http_digest($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($usuarios[$datos['username']]))
die('Credenciales incorrectas');
// Generar una respuesta válida
$A1 = md5($datos['username'] . ':' . $dominio . ':' . $usuarios[$datos['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$datos['uri']);
$respuesta_válida = md5($A1.':'.$datos['nonce'].':'.$datos['nc'].':'.$datos['cnonce'].':'.$datos['qop'].':'.$A2);
if ($datos['response'] != $respuesta_válida)
die('Credenciales incorrectas');
// Todo bien, usuario y contraseña válidos
echo 'Se ha identificado como: ' . $datos['username'];
// Función para analizar la cabecera de autenticación HTTP
function analizar_http_digest($txt)
{
// Protección contra datos ausentes
$partes_necesarias = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$datos = array();
$claves = implode('|', array_keys($partes_necesarias));
preg_match_all('@(' . $claves . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $coincidencias, PREG_SET_ORDER);
foreach ($coincidencias as $c) {
$datos[$c[1]] = $c[3] ? $c[3] : $c[4];
unset($partes_necesarias[$c[1]]);
}
return $partes_necesarias ? false : $datos;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment