Nodejs API:默认情况下似乎启用了 CORS

Posted

技术标签:

【中文标题】Nodejs API:默认情况下似乎启用了 CORS【英文标题】:Nodejs API : CORS seems to be enabled by default 【发布时间】:2018-09-09 10:12:37 【问题描述】:

这是我的问题:我有一个站点 exemple.com 和一个节点服务器,我的 API 在 exemple.com:3000 上运行。我希望我的 API 只能由 example.com 访问。

所以我认为如果我在响应中发送标题:Access-Control-Allow-Origin: https:exemple.com,那么同源策略会阻止来自除我之外的每个站点的所有请求。

问题是,如果我在另一个站点上调用 url:http://exemple.com:3000/api/v1/test/search,我会遇到错误:

无法加载https://exemple:3000/api/v1/test/search:“Access-Control-Allow-Origin”标头的值“https://exemple.com”不等于提供的来源。 Origin 'http://randomsite.com' 因此不允许访问。

但在网络选项卡中,我的响应是 200 状态和所有结果。

如何同时出现错误和结果?这是我的代码:

app.js

const corsApiOptions = 
  origin: 'https://exemple.com',
  originSuccessStatus: 200,
;

app.use('/api/v1', cors(corsApiOptions), api);

路由/api.js

  const express = require('express'); const mongoose =
     require('mongoose'); const mongoosastic = require('mongoosastic');
     const AssoSchema = require('../schemas/assoSchema');

    const router = express.Router();

     router.post('/assos/search', (req, res) =>    let  query  =
     req.body;   if (query && query.length > 0) 
         query = query
           .split(' ')
           .map(el => `$el~`)
           .join(' ');

        mongoose.connect('mongodb://localhost/mydb');
        AssoSchema.plugin(mongoosastic);

         const Asso = mongoose.model('asso', AssoSchema, 'assos');
         Asso.search(
           
             query_string:  query ,
           ,
            hydrate: true ,
           (err, results) => 
             if (err) res.json( error: err );
             res.json(results.hits.hits);
        ,
       );    else res.json(''); );

    module.exports = router;

如果我从 randomsite.com 的控制台发出 ajax 请求,以下是结果

//General
Request URL: https://exemple.com:3000/api/v1/test/search
Request Method: POST
Status Code: 200 OK
Remote Address: X.X.X.X:3000
Referrer Policy: no-referrer-when-downgrade
//Response Headers
Access-Control-Allow-Origin: https://exemple.com
Connection: keep-alive
Content-Length: 10022
Content-Type: application/json; charset=utf-8
Date: Fri, 30 Mar 2018 10:52:25 GMT
ETag: W/"2726-3/3tY5WvDTtyKm4KPBifg2dP7mI"
Vary: Origin
X-Powered-By: Express
//Request Headers
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 21
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: exemple.com:3000
Origin: http://randomsite.com
Referer: http://random.site.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.181 Safari/537.36
//Form Data
query: random search

在预览选项卡中,我可以在 json 中看到我所有的 10 个结果。

我希望我的 api 只能从 exemple.com 访问,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

但在网络选项卡中,我的响应是 200 状态和所有结果。

怎么可能同时出现错误和结果?

同源策略阻止 javascript(嵌入在不同源的网页中)读取响应中的数据。

它由浏览器强制执行。

它不会阻止发出请求。

它不会阻止浏览器获得响应。

它不会阻止浏览器的所有者通过其他方式(例如“网络”选项卡)查看响应,即使可以,他们也可以使用其他工具(例如 cURL)发出 HTTP 请求。

CORS 允许服务器告诉浏览器放宽同源策略并允许 JavaScript 访问数据。

我希望我的 api 只能从 exemple.com 访问,有人可以帮助我吗?

这是不可能的。

其他来源的 JavaScript 将无法直接读取数据,但它对非 JS 方法或间接(例如通过代理)方法没有任何作用。

【讨论】:

好的,如果我理解,cors 会阻止来自页面 javascript 的调用中的数据(在脚本标签内),但不会阻止来自 curl、postman、chrome 控制台调用的数据,对吗?为了只阻止我的网站,我制作了一个中间件来检查 ip 和来源,它现在就像我想要的那样工作。 关闭。 Same Origin Policy 阻止嵌入在页面中的 JavaScript。 CORS 允许放宽该规则。同源策略不适用于网页内运行的代码以外的任何内容(因此不适用于 cURL、邮递员等) 是的,我明白了,只是写错了 Cors 而不是同源策略。谢谢。

以上是关于Nodejs API:默认情况下似乎启用了 CORS的主要内容,如果未能解决你的问题,请参考以下文章

“启用设备管理员”对话框未显示

默认情况下启用自动修复。使用单字符串形式

如何在启用默认 EBS 加密的情况下使用 Beanstalk?

默认情况下启用 AES-NI 内在函数?

在不使用 Play Services API 的情况下启用位置/GPS 设置

Express 启用 COR 标头仍然会导致错误