CORS“允许凭据”Nodejs/Express

Posted

技术标签:

【中文标题】CORS“允许凭据”Nodejs/Express【英文标题】:CORS 'Allow-Credentials' Nodejs/Express 【发布时间】:2018-08-17 17:56:44 【问题描述】:

我的项目在带有 Express 后端的 Node 上运行。

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

加载失败 http://0.0.0.0:8529/_db/database/_api/cursor:回复 预检请求未通过访问控制检查: 响应中的“Access-Control-Allow-Credentials”标头为“false” 当请求的凭证模式为“包含”时,它必须为“真”。 因此,Origin 'http://localhost:3000' 不允许访问。这 XMLHttpRequest 发起的请求的凭证模式是 由 withCredentials 属性控制。

我在客户端 js 上的代码如下所示:

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.

编辑: 1 年后事后看来,这个问题非常愚蠢 - 正确答案是不要通过客户端 JS 公开您的数据库凭据...与您的后端通信,并拥有它与您的数据存储进行通信。

【问题讨论】:

我在客户端 js 上的代码是这样的:。真的吗 ?您正在客户端连接到 db 吗? 你应该尝试从服务器端连接数据库我认为问题会得到解决 需要注意的是,发送Allow-Credentials true时,不能Allow-Origin * @jayf93。这不是它的工作原理。您应该连接到服务器端的数据库并向服务器发送数据请求。 你去expressjs.com/en/guide/database-integration.html 【参考方案1】:

您正在配置 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)); 已经为您处理了。

【讨论】:

将原点设置为 * 真的可以使用凭据吗?如果 Access-Control-Allow-Origin 设置为 *,是否不应该阻止带有凭据标志的请求? developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/…【参考方案2】:

当您使用凭据配置 cors 时,您必须使用“受信任” URL 或一组“受信任” URL 设置 origin,每个 URL 都具有协议 + 域 + 端口。 origin : '*' 被阻止,因为对每个来源使用凭据过于宽松。这就像根本不使用凭据一样。

【讨论】:

以上是关于CORS“允许凭据”Nodejs/Express的主要内容,如果未能解决你的问题,请参考以下文章

CORS“允许凭据”Nodejs/Express

CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)

API 网关 CORS 问题

预检访问控制允许凭据

访问控制允许凭据错误--nodejs

CORS(跨域资源共享)来源验证失败