2010-03-16 39 views
5

Quiero almacenar la línea de encabezado de autenticación HTTP básica en una cookie de autenticación, para no tener que lidiar con el encabezado de autorización en solicitudes posteriores (estoy usando jQuery):Ajax: autenticación básica de HTTP y cookie de autenticación

authenticate: function(auth) { 
    var header = "Basic " + $.base64.encode(auth.username + ":" + auth.password); 
    document.cookie = "Authorization: " + header; 
    $.ajax({ 
     type: "GET", 
     url: "http://someurl", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: auth.success, 
     error: auth.error 
    }); 
}, 

Si bien esto parece que funciona para el primer usuario que se conecte, no funciona para cualquier otro usuario dentro de la sesión del navegador, ya que los encabezados de autorización posteriores se añaden y no sobrescrito. Sé que se podría sobreescribir una cookie utilizando la sintaxis name=value, pero esta sintaxis no se aplica al encabezado de autorización.

¿Hay alguna forma de deshacerse del encabezado de autorización anterior una vez que un nuevo usuario inicia sesión?

Cualquier ayuda sería apreciada. Gracias, JeHo

+0

¿Se puede cambiar cualquier código en el lado del servidor? ¿Qué idioma estás usando (PHP, python, etc.)? – bpedro

+0

El lado del servidor es un servicio de datos wcf (WebServiceHost) autohospedado (escrito en C#). Soy el propietario de este host, por lo que podría hacer cambios en él, pero me temo que las posibilidades son limitadas. – Jeldrik

Respuesta

11

Parece que tampoco funcionó para el primer usuario. El problema fue que el encabezado de autorización probablemente fue configurado por el navegador más temprano (cuando utilicé el diálogo de autenticación del navegador).

Lo que estoy haciendo ahora es almacenar la información de inicio de sesión en una cookie estándar de nombre = valor y configurar manualmente el encabezado de autorización.

Establecer la cookie:

var header = "Basic " + $.base64.encode(auth.username + ":" + auth.password); 
document.cookie = "Authorization=" + header; 

Leer la cookie:

function getAuthCookie() { 
    var cn = "Authorization="; 
    var idx = document.cookie.indexOf(cn) 

    if (idx != -1) { 
     var end = document.cookie.indexOf(";", idx + 1); 
     if (end == -1) end = document.cookie.length; 
     return unescape(document.cookie.substring(idx + cn.length, end)); 
    } else { 
     return ""; 
    } 
} 

Establecer la cabecera de autorización:

$.ajax({ 
     type: "GET", 
     url: "http://someurl", 
     contentType: "application/json; charset=utf-8", 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Authorization", getAuthCookie()); 
     }, 
     dataType: "json", 
     success: auth.success, 
     error: auth.error 
    }); 

Esto parece un poco incómodo, pero funciona.

Cuestiones relacionadas