2010-03-16 224 views
5

我想將HTTP基本身份驗證標題存儲在身份驗證Cookie中,這樣我就不必在隨後的請求中處理授權頭(我正在使用jQuery):Ajax:HTTP基本身份驗證和身份驗證Cookie

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

雖然這似乎對於誰登錄的第一個用戶的工作,它不會對瀏覽器會話中的任何其他用戶的工作,因爲後續授權頭被加入,而不是覆蓋。我知道可以使用name=value語法覆蓋cookie,但該語法不適用於授權標頭。

有沒有什麼辦法擺脫舊的授權頭一旦新用戶登錄?

任何幫助,將不勝感激。謝謝,JeHo

+0

你可以更改服務器端的任何代碼嗎?你使用什麼語言(PHP,Python等)? – bpedro 2010-03-16 15:17:36

+0

服務器端是一個selfhosted(WebServiceHost)wcf數據服務(用C#編寫)。我是這個東道主的老闆,所以我可以改變它 - 但我擔心可能性是有限的。 – Jeldrik 2010-03-16 15:51:08

回答

11

看來,它不適用於第一個用戶。問題是,授權標題可能是早期瀏覽器設置的(當我使用瀏覽器的驗證對話框時)。

我現在正在做的是將登錄信息存儲在標準名稱=值cookie中並手動設置授權標頭。

將Cookie:

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

讀取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 ""; 
    } 
} 

集合授權頭:

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

這似乎有點尷尬,但它的作品。