6

¿Hay alguna forma de cerrar la sesión de una autenticación resumida realizada en php?PHP Digest auth, cerrar sesión

He intentado unset ($ _ SERVER ["PHP_AUTH_DIGEST"]); Pero no pedirá volver a iniciar sesión. Sé que si cierro el navegador 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 modifique.

+0

Duplicado de [HTTP authentication logout via PHP] (http://stackoverflow.com/questions/449788/http-authentication-logout-via-php). La respuesta: No. – netcoder

+0

Sé que se puede hacer, pero no estoy seguro de cómo. –

+0

cerrar el navegador es la única manera, ya que la información está registrada dentro del navegador – ajreal

Respuesta

10

Desarreglo $ _SERVER ['PHP_AUTH_DIGEST'] no tendrá ningún efecto. El problema es que realmente no hay una respuesta "buena" para 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 "desconectarán 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 al recibir una respuesta del servidor de 401. Esto puede "cerrar" efectivamente a un usuario, forzándolo a volver a ingresar su nombre de usuario y contraseña . Algunas personas usan esto para "desconectarse" de los inicios de sesión, o proporcionan un botón de "cerrar sesión".

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

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

pero, de nuevo, esto no es en realidad algo aprobado por la especificación HTTP.

+0

Funciona, pero la página de cierre de sesión solicita iniciar sesión. y no puede iniciar sesión a través de él. De hecho, no puedo iniciar sesión en absoluto. oh, me desconectó bien solo no puedo iniciar sesión nuevamente. También tenía que dar solo el encabezado ("HTTP/1.1 401 no autorizado"); no hay www-autherticate nuevamente. –

+0

Es bueno saber que no estaba seguro de si Digest lo requería. Todavía no he implementado Digest en algo mío. – TML

+0

Me parece que algo como lo siguiente funciona bien para mí: http: // codepad.org/BUJvSmnm Tenga en cuenta que, en mi caso, encontré al menos un navegador (Firefox 3.6) que DID requirió el encabezado WWW-Authenticate en logout(), así que estoy persistiendo el generado uniqid() en $ _SESSION para su uso en el encabezado de sesión. – TML

6

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 dominio =, o confirmar una solicitud de autenticación AJAX con credenciales válidamente válidas.

+0

Vale la pena señalar que la sección relevante de este documento borrador IETF es 6.1: credenciales de autenticación y clientes inactivos – TML

+0

código php por favor? –

+0

@JamesM: debe iniciar esto a través de jQuery para no mostrar un cuadro de diálogo de inicio de sesión. Solicite un 'logout1.php' por separado, que p. Ej. envía 'encabezado (" Estado: 401 Cerrar sesión ")' y 'encabezado (" WWW-Authenticate: Invalidate, Basic realm = logout ")'. Opcionalmente una segunda llamada AJAX con credenciales no válidas a 'logout2.php' que lo reconoce sin verificar. – mario

Cuestiones relacionadas