2010-03-16 23 views
5

Desidero memorizzare la riga di intestazione dell'autenticazione di base HTTP in un cookie di autenticazione, in modo da non dover gestire l'intestazione di autorizzazione nelle richieste successive (sto utilizzando jQuery):Ajax: autenticazione di base HTTP e cookie di autenticazione

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 
    }); 
}, 

Anche se questo sembra funzionare per il primo utente che effettua l'accesso, non funziona per nessun altro utente all'interno della sessione del browser, poiché le intestazioni di autorizzazione successive vengono aggiunte e non sovrascritte. So che uno potrebbe sovrascrivere un cookie utilizzando la sintassi name=value, ma questa sintassi non si applica all'intestazione dell'autorizzazione.

C'è un modo per sbarazzarsi della vecchia intestazione di autorizzazione dopo l'accesso di un nuovo utente?

Qualsiasi aiuto sarebbe apprezzato. Grazie, JeHo

+0

È possibile modificare qualsiasi codice sul lato server? Che lingua stai usando (PHP, python, ecc.)? – bpedro

+0

Il lato server è un servizio dati wcf con hosting automatico (WebServiceHost) (scritto in C#). Sono il proprietario di questo host, quindi potrei apportare modifiche ad esso - ma temo che le possibilità siano limitate. – Jeldrik

risposta

11

Sembra che non abbia funzionato neanche per il primo utente. Il problema era che l'intestazione dell'autorizzazione era probabilmente impostata dal browser in precedenza (quando ho usato la finestra di autenticazione del browser).

Quello che sto facendo ora è memorizzare le informazioni di accesso in un cookie name = value standard e impostare manualmente l'intestazione di autorizzazione.

impostare il cookie:

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

leggere il 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 ""; 
    } 
} 

Impostare l'intestazione autorizzazione:

$.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 
    }); 

Questo sembra un po 'imbarazzante, ma funziona.

Problemi correlati