无法在安全的Google Cloud Function上获得CORS错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在安全的Google Cloud Function上获得CORS错误相关的知识,希望对你有一定的参考价值。
我具有Google Cloud Function。我为项目创建了凭据,并授权http://localhost和http://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'标头出现在请求的资源上。
需要注意的几件事...
- 如果我使该功能可用于allUsers,则不会出现CORS问题
- 通过记录,我已经确认,在获得安全保护后,该请求永远不会到达我拥有用于检查飞行前选项的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错误的主要内容,如果未能解决你的问题,请参考以下文章
无法在 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”