无法在安全的Google Cloud Function上获得CORS错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在安全的Google Cloud Function上获得CORS错误相关的知识,希望对你有一定的参考价值。

我具有Google Cloud Function。我为项目创建了凭据,并授权http://localhosthttp://localhost:3000作为来源。我也有一个Google用户帐户,该帐户授予了cloudfunctions.functions.invoke角色。我会通过转到控制台中的云功能并展开“云功能调用程序”项并在此处看到我的帐户来确认这一点。

我可以使用curl成功访问该功能。

curlhttps://[google-cloud-server]/test5-H“授权:不记名的我的身份令牌”

但是,如果我尝试从我的React应用程序中调用该函数(我尝试了axios和fetch),则会收到以下错误...。

从源'https://[google-cloud-server]/test5?a=b'到'http://localhost:3000'的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:没有'Access-Control-Allow-Origin'标头出现在请求的资源上。

需要注意的几件事...

  1. 如果我使该功能可用于allUsers,则不会出现CORS问题
  2. 通过记录,我已经确认,在获得安全保护后,该请求永远不会到达我拥有用于​​检查飞行前选项的CORS代码的函数。这是合理的,因为它应该由Google保护。但是我在Google Cloud函数上找到的所有文档都在谈论从函数内部处理CORS相关内容。在我的React应用程序达到我的功能之前,有一些响应。我不知道什么/在哪里。

我在这篇文章中添加了很多标签,因为我真的不知道是哪层引起了问题。我可能正在做一些非常明显/愚蠢的事情,但是我没有主意!

云功能。...

exports.test5 = (req, res) => {

  console.log('function invoked');
  // 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') {
    console.log('Determined it is OPTIONS request');
    // 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 {

    console.log('Main function body');
    res.send('Hello World!');
  }
};

React客户打来的电话...

  const config = 
  {
    params: payload,
    headers: 
    { 
      Authorization: `bearer ${window.IDENTITY_TOKEN}`
    }
  };

  axios.get(url, config)
      .then((res) => {
          ...

      })
      .catch((err) => {
          handleError(err);
      });

有什么想法吗?谢谢

答案

CORS preflight OPTION请求没有Authorization标头,并且Cloud函数IAM会预先验证Authorization标头,如果丢失,它将不调用该函数。因此,为了提供CORS preflight响应,您必须允许allUsers访问您的Cloud函数。

以上是关于无法在安全的Google Cloud Function上获得CORS错误的主要内容,如果未能解决你的问题,请参考以下文章

google.cloud 导入存储:无法导入存储

无法在 python 脚本中导入 google.cloud 模块

无法在 Spring Data Cloud Spanner 中将 java.sql.Timestamp 转换为 com.google.cloud.Timestamp

如何从Java脚本安全地调用Google Cloud Run服务?

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”

无法在 Google Cloud SQL 中运行迁移