7

我想将 HTTP 基本身份验证标头存储在身份验证 cookie 中,这样我就不必在后续请求中处理授权标头(我使用的是 jQuery):

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,但这种语法不适用于授权标头。

新用户登录后,有什么方法可以摆脱旧的授权标头?

任何帮助,将不胜感激。谢谢,杰霍

4

1 回答 1

12

看来,它也不适用于第一个用户。问题是,授权标头可能是由浏览器早些时候设置的(当我使用浏览器的身份验证对话框时)。

我现在正在做的是将登录信息存储在标准的 name=value cookie 中并手动设置授权标头。

设置cookie:

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

阅读饼干:

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

这似乎有点尴尬,但它确实有效。

警告:确保对您存储在 cookie 中的任何敏感数据进行编码,否则会导致安全问题。检查CWE了解更多信息。

于 2010-03-17T09:10:05.037 回答