CORS 'Allow-Credentials' Nodejs/Express

6

我的项目是在Node和Express后端上运行的。

我正在尝试使用Arangojs在客户端查询我的Arango数据库。ArangoDB在Digital Ocean上通过Docker运行。我没有问题在服务器端查询我的数据库,然而在页面加载时我收到以下错误:

无法加载 http://0.0.0.0:8529/_db/database/_api/cursor:预检请求未通过访问控制检查:响应中“Access-Control-Allow-Credentials”头的值为“false”,当请求的凭据模式为“include”时必须为“true”。因此,源“http://localhost:3000”不允许访问。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。

我的客户端JavaScript代码如下:

var db = new arangojs.Database({url:'http://0.0.0.0:8529'})
db.useDatabase(dbase)
db.useBasicAuth("database", 'password')
db.query('FOR doc IN docs RETURN doc') // etc. etc.

编辑: 一年后回顾,这个问题有点愚蠢 - 正确的答案是不要通过客户端JS公开数据库凭据...与后端通信,并让后端与数据存储通信。


3
我的客户端 JavaScript 代码看起来像这样:_。真的吗?你正在客户端连接到数据库? - Muhammad Usman
@UsmanRana 是的,对于API。 - user9081620
2
需要注意的一点是,当发送Allow-Credentials true时,不能使用Allow-Origin *。 - Jaromanda X
1
@jayf93,这不是这样工作的。你应该在服务器端建立到数据库的连接,并向服务器发送请求获取数据。 - Muhammad Usman
1
请看这里:https://expressjs.com/zh-cn/guide/database-integration.html - Muhammad Usman
显示剩余3条评论
2个回答

16
你配置 cors() 的方式不正确,你需要使用credentials属性来配置Access-Control-Allow-Credentials
var cors = require('cors');
var corsOptions = {
    origin: '*',
    credentials: true };

app.use(cors(corsOptions));

除此之外,你的app.all(* ...是不必要的,因为app.use(cors(corsOptions));已经为你处理了。


8
将 origin 设置为 * 对于凭据来说真的有效吗?如果 Access-Control-Allow-Origin 被设置为 *,那么携带凭据标志的请求不应该被阻止吗?https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials - mic
2
如果您配置了 origin: "*",则凭据机制将无法工作。如果您想让凭据起作用,必须指定一个精确的 HTTP 来源。例如:origin: 'https://www.google.com' 或包含多个来源的数组:origin: [a, b, c] - Raz Buchnik
这个救了我的一天。谢谢。我可以确认通配符"*"是不起作用的。谢谢! - BartmanDilaw
可以确认 "*" 不起作用。 - aderesh

7

当您使用凭据配置CORS时,必须使用“受信任”的URL或由协议+域名+端口组成的“受信任”URL数组来设置来源。 "*" 的来源被阻止,因为对于每个来源使用凭据过于宽容,就像根本不使用凭据一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接