Firebase 云功能中的 CORS 块

Posted

技术标签:

【中文标题】Firebase 云功能中的 CORS 块【英文标题】:CORS block in firebase cloud function 【发布时间】:2021-03-05 10:16:21 【问题描述】:

我正在实现一个云功能以从 BigQuery 获取结果。下面是我的函数/index.js 代码

const functions = require('firebase-functions');
const BigQuery = require('@google-cloud/bigquery');
const cors = require('cors')(origin: true);

exports.getBigQueryData = functions.region('europe-west3').https.onRequest((req,res) => 
  cors(req,res,() => 
    const bigquery = new BigQuery(
      projectId: 'neon-opus-585',
      keyFilename: 'service_account_bq.json'
    );
    const query = "SELECT * FROM `xxxx`";
    bigquery.createQueryJob(query: query).then((data) => 
      const job = data[0];
      return job.getQueryResults();
    )
    .then(results => return res.send(results))
    .catch(error => console.log(error))
  )
)

当我只部署/测试该功能时,一切运行正常,但是当我从我的应用程序内部使用它时,我收到以下错误

CORS 策略已阻止从源“http://localhost:5000”访问“https://xxxx.cloudfunctions.net/xxxx”获取:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

如您所见,我尝试导入 cors 包并在我的函数中实现它,正如这里的几篇帖子所建议的那样,但它仍然无法正常工作。

任何帮助将不胜感激:)

【问题讨论】:

【参考方案1】:

看看Handling CORS requests,你有一个例子:

要处理预检请求,您必须设置适当的 Access-Control-Allow-* 标头以匹配您要接受的请求:

exports.corsEnabledFunction = (req, res) => 
  // Set CORS headers for preflight requests
  // Allows GETs from any origin with the Content-Type header
  // and caches preflight response for 3600s

  res.set('Access-Control-Allow-Origin', '*');

  if (req.method === 'OPTIONS') 
    // Send response to OPTIONS requests
    res.set('Access-Control-Allow-Methods', 'GET');
    res.set('Access-Control-Allow-Headers', 'Content-Type');
    res.set('Access-Control-Max-Age', '3600');
    res.status(204).send('');
   else 
    res.send('Hello World!');
  
;

还有Authentication with CORS:

如果您计划发送带有 Authorization 标头的请求,您必须:

    将 Authorization 标头添加到 Access-Control-Allow-Headers。 将 Access-Control-Allow-Credentials 标头设置为 true。 在 Access-Control-Allow-Origin 中设置特定来源(不接受通配符)。
exports.corsEnabledFunctionAuth = (req, res) => 
  // Set CORS headers for preflight requests
  // Allows GETs from origin https://somedomain.com with Authorization header

  res.set('Access-Control-Allow-Origin', 'https://somedomain.com');
  res.set('Access-Control-Allow-Credentials', 'true');

  if (req.method === 'OPTIONS') 
    // Send response to OPTIONS requests
    res.set('Access-Control-Allow-Methods', 'GET');
    res.set('Access-Control-Allow-Headers', 'Authorization');
    res.set('Access-Control-Max-Age', '3600');
    res.status(204).send('');
   else 
    res.send('Hello World!');
  
;

【讨论】:

我在哪里放我的功能代码。这是我的帖子***.com/questions/68646425/…

以上是关于Firebase 云功能中的 CORS 块的主要内容,如果未能解决你的问题,请参考以下文章

CORS 不适用于 Firebase 云功能中的特定域

为 Firebase 云功能启用 Cors

Firebase 云功能:带有 CORS 阻止的总线男孩的 POST 方法

未为 Firebase 云功能启用 Cors

云功能和 Firebase 的客户端 CORS 错误

CORS 阻止访问资源:如何在 Firebase 云功能中修复?