基本 HTTP 授权标头

Posted

技术标签:

【中文标题】基本 HTTP 授权标头【英文标题】:Basic HTTP authorization header 【发布时间】:2016-04-24 15:09:07 【问题描述】:

我想在客户端使用 JQuery 和在服务器端使用 Node.js 设置基本的 HTTP 身份验证。 我在服务器端发出了以下 Ajax 请求来设置标头:

$.ajax(
        type: "GET",
        url: URL_SLACK_SERVER,
        dataType: "json",
        beforeSend: function(xhr)
            xhr.setRequestHeader("Authorization", "Basic " +btoa("username:xxx") );
        ,
        success:function(rsp)
            filterMessages(rsp);
        
    );

我想在我的服务器端使用 basic-auth 模块:

var express = require('express');
var bodyParser = require('body-parser');
var auth = require('basic-auth');

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Authorization, Accept, Key");
  var cre = +auth(req);
  console.log('Auth: ' +cre.username);
  next();
);

但是,这样做,我遇到了一些问题:

    我没有看到在预检 OPTIONS HTTP 请求中设置了标头:

选项 /server HTTP/1.1 主机:server.com 连接:保持活动 访问控制请求方法:GET 来源:空 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/47.0.2526.111 Safari/537.36 访问控制请求标头:接受、授权 接受:/ 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8,fr;q=0.6

    我收到以下错误,我不太理解:

请求头域 Authorization is not allowed by 预检响应中的 Access-Control-Allow-Headers。

另外,请注意,从客户端到服务器的调用是跨域调用,这就是为什么在 Node.js 文件中写了这些设置的标头。

我怎样才能有效地执行这个基本的 HTTP 身份验证?

【问题讨论】:

看起来您的服务器和客户端在不同的域上运行,并且服务器没有设置正确的 CORS 标头。 它们确实在不同的域上运行(见我问题的结尾)。我可以在服务器端添加哪些标头? 【参考方案1】:

由于您的客户端和服务器在不同的域上运行,您需要在服务器中配置 CORS 标头以使其工作。

您需要在服务器中设置标头"Access-Control-Allow-Origin:http://foo.example""Access-Control-Allow-Origin:*"

【讨论】:

res.header("Access-Control-Allow-Origin", "*");还不够吗? 这也可以,但任何域都可以访问它。【参考方案2】:

是的,这是一个 cors 问题。 当您在 npm 中启用 cors(查找 cors 模块并通过 npm 附加它)时,您可以设置允许的特定域。当您设置此项时,基本身份验证标头将与请求一起发送。 看看这个请求: https://***.com/a/18511690/3232739

【讨论】:

以上是关于基本 HTTP 授权标头的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域”

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头是“协商,NTLM”

HTTP 规范:代理授权和授权标头

用于基本授权的 ajax 设置标头不起作用

使用 WCF 的 Http 请求中缺少授权标头

php + curl + multipart/form-data + 代理授权(基本)