¿Cuál es la forma correcta de cerrar sesión en la carpeta protegida de autenticación HTTP?
Hay soluciones que pueden lograr esto, pero son potencialmente peligrosas porque pueden tener errores o no funcionan en ciertas situaciones / navegadores. Es por eso que estoy buscando una solución correcta y limpia.
php
authentication
.htaccess
http-headers
password-protection
Josef Sábl
fuente
fuente
Miscellaneous -> Clear Private Data -> HTTP Authentication
Respuestas:
Mu. No existe una forma correcta , ni siquiera una que sea consistente en todos los navegadores.
Este es un problema que proviene de la especificación HTTP (sección 15.6):
Por otro lado, la sección 10.4.2 dice:
En otras palabras, es posible que pueda volver a mostrar el cuadro de inicio de sesión (como dice @Karsten ), pero el navegador no tiene que cumplir con su solicitud , así que no dependa demasiado de esta característica (incorrecta).
fuente
Método que funciona bien en Safari. También funciona en Firefox y Opera, pero con una advertencia.
Esto le dice al navegador que abra la URL con un nuevo nombre de usuario, anulando el anterior.
fuente
user:password@host
está en desuso. Usar solohttp://[email protected]/
no es y debería funcionar en la mayoría de los casos.La respuesta simple es que no puede cerrar sesión de forma confiable en la autenticación http.
La respuesta larga:
Http-auth (como el resto de la especificación HTTP) no tiene estado. Por lo tanto, estar "conectado" o "desconectado" no es realmente un concepto que tenga sentido. La mejor manera de verlo es preguntando, para cada solicitud HTTP (y recuerde que una carga de página suele ser varias solicitudes), "¿se le permite hacer lo que está solicitando?". El servidor ve cada solicitud como nueva y no relacionada con ninguna solicitud anterior.
Los navegadores han optado por recordar las credenciales que les dices en el primer 401 y volver a enviarlas sin el permiso explícito del usuario en solicitudes posteriores. Este es un intento de darle al usuario el modelo "conectado / desconectado" que esperan, pero es puramente un error. Es el navegador que simula esta persistencia de estado. El servidor web lo desconoce por completo.
Entonces, "cerrar sesión", en el contexto de http-auth, es puramente una simulación proporcionada por el navegador y, por lo tanto, está fuera de la autoridad del servidor.
Sí, hay kludges. Pero rompen el RESTfulness (si eso es de valor para usted) y no son confiables.
Si necesita absolutamente un modelo de inicio / cierre de sesión para la autenticación de su sitio, la mejor opción es una cookie de seguimiento, con la persistencia del estado almacenado en el servidor de alguna manera (mysql, sqlite, flatfile, etc.). Esto requerirá que todas las solicitudes sean evaluadas, por ejemplo, con PHP.
fuente
Solución alterna
Puedes hacer esto usando Javascript:
Lo que se hace arriba es:
para IE : simplemente borre el caché de autenticación y redirija a alguna parte
para otros navegadores : envíe una solicitud XMLHttpRequest detrás de escena con el nombre de usuario y la contraseña de 'cerrar sesión'. Necesitamos enviarlo a una ruta que devuelva 200 OK a esa solicitud (es decir, no debería requerir autenticación HTTP).
Reemplace
'/where/to/redirect'
con alguna ruta para redirigir después de cerrar sesión y reemplace'/path/that/will/return/200/OK'
con alguna ruta en su sitio que arroje 200 OK.fuente
Solución alternativa (no es una solución limpia, agradable (¡o incluso funciona! Ver comentarios)):
Desactiva sus credenciales una vez.
Puede mover su lógica de autenticación HTTP a PHP enviando los encabezados apropiados (si no ha iniciado sesión):
Y analizando la entrada con:
Así que deshabilitar sus credenciales una vez debería ser trivial.
fuente
Cerrar sesión de autenticación básica HTTP en dos pasos
Digamos que tengo un dominio de autenticación básica HTTP llamado "protegido por contraseña", y Bob está conectado. Para cerrar sesión, hago 2 solicitudes AJAX:
WWW-Authenticate: Basic realm="Password protected"
En este punto, el navegador olvidó las credenciales de Bob.
fuente
Mi solución al problema es la siguiente. Puede encontrar la función
http_digest_parse
,$realm
y$users
en el segundo ejemplo de esta página: http://php.net/manual/en/features.http-auth.php .fuente
Por lo general, una vez que un navegador ha pedido al usuario las credenciales y las ha proporcionado a un sitio web en particular, continuará haciéndolo sin más indicaciones. A diferencia de las diversas formas en que puede borrar las cookies en el lado del cliente, no conozco una forma similar de pedirle al navegador que olvide las credenciales de autenticación proporcionadas.
fuente
Trac, de manera predeterminada, también utiliza la autenticación HTTP. Cerrar sesión no funciona y no se puede solucionar:
De: http://trac.edgewall.org/ticket/791#comment:103
Parece que no hay una respuesta funcional a la pregunta, ese problema se informó hace siete años y tiene mucho sentido: HTTP no tiene estado. Una solicitud se realiza con credenciales de autenticación o no. Pero eso es cuestión de que el cliente envíe la solicitud, no del servidor que la recibe. El servidor solo puede decir si un URI de solicitud necesita autorización o no.
fuente
Necesitaba restablecer la autorización .htaccess, así que usé esto:
Lo encontré aquí: http://php.net/manual/en/features.http-auth.php
Imagínate.
Varias soluciones residen en esa página e incluso se observa en la parte inferior: Lynx, no borra la autenticación como otros navegadores;)
Lo probé en mis navegadores instalados y una vez cerrado, parece que cada navegador requiere constantemente una nueva autorización al volver a ingresar.
fuente
WWW-Authenticate
estaba causando el problema, deshacerse de eso me desconectó automáticamente.WWW-Authenticate
mensaje mientras soluciona el problema en un navegador (Chrome) hace que otro navegador (Firefox) recuerde las credenciales y las envíe en la siguiente solicitud, lo que resulta en un reinicio de sesión automático. Argh!Esta podría no ser la solución que se buscaba, pero la resolví así. Tengo 2 scripts para el proceso de cierre de sesión.
logout.php
log.php
De esta manera no recibo una advertencia y mi sesión finaliza
fuente
AFAIK, no hay una forma limpia de implementar una función de "cierre de sesión" cuando se usa la autenticación htaccess (es decir, basada en HTTP).
Esto se debe a que dicha autenticación utiliza el código de error HTTP '401' para indicarle al navegador que se requieren credenciales, momento en el cual el navegador solicita al usuario los detalles. A partir de ese momento, hasta que se cierre el navegador, siempre enviará las credenciales sin más indicaciones.
fuente
La mejor solución que encontré hasta ahora es (es una especie de pseudocódigo,
$isLoggedIn
es una pseudo variable para http auth):En el momento del "cierre de sesión", simplemente almacene cierta información en la sesión que indique que el usuario está realmente desconectado.
En el lugar donde verifico la autenticación, amplío la condición:
La sesión está algo vinculada al estado de la autenticación http, por lo que el usuario permanece desconectado mientras mantenga abierto el navegador y mientras la autenticación http persista en el navegador.
fuente
Tal vez me estoy perdiendo el punto.
La forma más confiable que he encontrado para finalizar la autenticación HTTP es cerrar el navegador y todas las ventanas del navegador. Puede cerrar una ventana del navegador usando Javascript, pero no creo que pueda cerrar todas las ventanas del navegador.
fuente
La única forma efectiva que he encontrado para eliminar las credenciales
PHP_AUTH_DIGEST
oPHP_AUTH_USER
ANDPHP_AUTH_PW
es llamar al encabezadoHTTP/1.1 401 Unauthorized
.fuente
Mientras que los otros tienen razón al decir que es imposible cerrar sesión desde la autenticación básica http, hay formas de implementar la autenticación que se comportan de manera similar. Un enfoque obvio es usar auth_memcookie . Si realmente desea implementar la autenticación HTTP básica (es decir, usar los cuadros de diálogo del navegador para iniciar sesión en un lugar que no sea un formulario HTTP) utilizando esto, simplemente configure la autenticación en un directorio protegido .htaccess separado que contenga un script PHP que redirige de nuevo a donde vino el usuario creando la sesión de memcache.
fuente
Aquí hay muchas respuestas excelentes, complejas. En mi caso particular, encontré una solución limpia y simple para cerrar sesión. Todavía tengo que probar en Edge. En mi página en la que he iniciado sesión, he colocado un enlace de cierre de sesión similar a este:
Y en la cabecera de esa página logout.html (que también está protegida por .htaccess) tengo una actualización de página similar a esta:
Donde dejaría las palabras "cerrar sesión" para borrar el nombre de usuario y la contraseña almacenados en caché para el sitio.
Admitiré que si se necesita iniciar sesión directamente en varias páginas desde el principio, cada uno de esos puntos de entrada necesitaría su propia página correspondiente logout.html. De lo contrario, podría centralizar el cierre de sesión introduciendo un paso de gatekeeper adicional en el proceso antes de la solicitud de inicio de sesión real, que requiere la entrada de una frase para llegar a un destino de inicio de sesión.
fuente