基本 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 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域”