PHP дайджест аутентификации, запрашивая учетные данные снова и снова - PullRequest
0 голосов
/ 22 октября 2019

У меня есть старая сеть, в которой используется такая аутентификация. Сеть работала годами, и код не был модифицирован, но вдруг он перестает работать.

Когда я ввожу учетные данные, не имеет значения, верны они или нет, сайт спрашивает меня учетные данные снова и снова.

Это мой код:

dominio = 'Area restringida';

// usuario => contraseña
$usuarios = array('user' => 'pass');

//session_unset();
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('Ha cancelado el inicio de sesión');
}


// 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');



// 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;
}

Я пытался написать "умирает" внутри функций, а между ними просто пытался выяснить, что происходит, но выполнение никогда не останавливается.

Я написал на свой хостинг, спрашивая о проблеме и спрашивая apache mod_auth_digest, но онисказал мне, что этот модуль никогда не был установлен на сервере.

...