Pregunta

¿Hay alguna forma de cerrar la sesión de una autenticación de resumen realizada en PHP?

He probado unset ($ _ servidor ["php_auth_digest"]); Pero no pedirá relajarse. Sé que si cierro el navegador, entonces funcionará y aquí están mis funciones.

    function login(){
        $realm = "Restricted area";
        $users = array("jamesm"=>"");
        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)."\"");
            return false;
        }
        if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]]))
            return false;
        $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)
            return false;
        return true;
    }
    function logout(){
        unset($_SERVER["PHP_AUTH_DIGEST"]);
        return true;
    }

¿Qué más necesito agregar a la función de cierre de sesión para terminar esto?

Si cambio el reino funciona, pero no quiero que se cambie.

¿Fue útil?

Solución

UNTENTACIÓN $ _SERVER ['PHP_AUTH_DIGEST'] no tendrá ningún efecto. El problema es que no hay realmente una "buena" respuesta a la tarea que ha establecido.

La especificación HTTP no lo permite técnicamente, pero en la práctica, la mayoría de los navegadores, "registrarán efectivamente al usuario" si les envía otro 401. por php.net/http-auth:

Tanto Netscape Navigator como Internet Explorer borrarán el caché de autenticación de la ventana del navegador local para el ámbito al recibir una respuesta del servidor de 401. Esto puede "cerrar sesión" de manera efectiva a un usuario, obligándolos a volver a ingresar su nombre de usuario y contraseña. Algunas personas usan esto para "tiempo de tiempo", o proporcionan un botón de "cierre de sesión".

Desde su código, el método más simple es probablemente algo así como:

function logout(){
    header('HTTP/1.1 401 Unauthorized');
    return true;
}

Pero, nuevamente, esto no es en realidad algo aprobado por la especificación HTTP.

Otros consejos

Respuesta autorizada: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - Sección 6.1
No hay una manera confiable.

Algunas soluciones incluyen falsificar un 401 y cambiar el reino =, o reconocer una solicitud de autenticación AJAX con credenciales a propósito inválidas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top