【问题标题】:Ajax: HTTP Basic Auth and authentication cookieAjax:HTTP 基本身份验证和身份验证 cookie
【发布时间】:2011-01-28 04:03:37
【问题描述】:

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

新用户登录后,有没有办法摆脱旧的授权标头?

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

【问题讨论】:

  • 你能改变服务器端的任何代码吗?您使用什么语言(PHP、python 等)?
  • 服务器端是一个自托管(WebServiceHost)的wcf数据服务(用c#写的)。我是该主机的所有者,因此我可以对其进行更改 - 但我担心可能性有限。

标签: javascript basic-authentication


【解决方案1】:

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

我现在正在做的是将登录信息存储在标准的 name=value 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
    });

这看起来有点尴尬,但确实有效。

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

【讨论】:

  • 将用户密码以明文形式存储在任何地方(尤其是在客户端)是不可能的。 不要这样做(绝对不在生产中)。
  • 因为我仍然在这里获得支持:William 是对的 - 这个解决方案是完全不安全的,因为 cookie 可以被 JavaScript 读取(此外,内容在 F12 开发工具中可见 - 因为 cookie 是未加密的) .
  • 您可能应该编辑您的答案以解决此安全问题。也许在答案的最后一个警告。我很确定当它起作用时,没有人会费心阅读本节。
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多