onCall Firebase云功能(GCP防火墙规则)的CORS问题

时间:2020-10-19 13:33:43

标签: firebase google-cloud-platform google-cloud-functions

两年前,我部署了一个包含多个Firebase云功能的项目,其中一些功能是通过使用数据库触发器来调用的,其中3个是通过使用“ functions.https.onCall…”触发器(“可调用的”功能)来调用的。

部署后一切正常,但是,在2019年10月左右,我不得不放弃该项目,并且我没有继续维护它。

当前,我有兴趣让该站点再次正常运行,因此我遵循了收到的电子邮件中列出的所有必要步骤,例如更新了node.js版本,firebase admin和functions版本,等等。上;但是,在重新部署功能之后,只有那些具有数据库触发器的功能似乎可以正常工作。 (请注意,这些功能自使用之日起并未进行任何修改。)

我在浏览器控制台上遇到无法使用的功能的错误是:

通过CORS策略阻止从源“ https://….com”获取“ https://…/ functionName”处的访问:不存在“ Access-Control-Allow-Origin”标头在请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。

在对我的步骤进行了一些测试和追溯之后,我已经能够精确地找出问题所在,但是,我还无法解决它。

基本上,我注意到自从我第一次部署项目以来,对GCP的权限处理方式已经发生了变化,因为我现在不得不添加防火墙规则,以便甚至能够运行以前使用的实例而无需这样做。因此,在我看来,很可能是防火墙本身阻止了功能连接到GCP上的虚拟机实例,从而阻止了功能运行时的完成并导致错误。

因此,我决定通过授予对实例的开放访问权限(通过指定0.0.0.0/0作为进入与虚拟机相关的目标标签的源IP范围)来对此进行测试,此后所有功能又再次完全发挥作用。

事实是,出于明显的原因,我确实不想保留对实例的开放访问权限,但是我无法通过任何其他方法建立成功的连接。

我阅读了以下页面:

访问控制: https://cloud.google.com/functions/docs/concepts/iam

配置网络设置: https://cloud.google.com/functions/docs/networking/network-settings

Cloud Functions IAM角色: https://cloud.google.com/functions/docs/reference/iam/roles#additional-configuration

另外: Firebase Functions to GCE firewall rule

然后,根据我的收集,我正在寻找的是设置防火墙规则,以便与该应用相关的服务帐户已启用权限。但是,我还没有这样做:

•首先,在防火墙规则详细信息中选择“指定目标标记”(就像我对IP范围所做的那样)将“服务帐户”禁用为源过滤器。

•将“网络中的所有实例”设置为目标,将“服务帐户”设置为源过滤器,并将“ App Engine默认服务帐户”(…@appspot.gserviceaccount.com)或“ firebase-adminsdk”设置为(firebase-adminsdk-…@ .... iam.gserviceaccount.com)作为“源服务帐户”;并未授予必要的权限,因为这些功能又回到了无法使用的状态。 对于最后一个选项,我什至遵循以下步骤: https://cloud.google.com/functions/docs/reference/iam/roles#additional-configuration 对于项目运行时服务帐户:…@appspot.gserviceaccount.com;但没有任何改变。

•最后,选择其他可用选项作为“源服务帐户”(Compute Engine默认服务帐户)也不会启用连接。

总之:完成此问题的唯一必要步骤是找到一种方法,该方法可以从Firebase云功能中调用GCP中的VM,而无需授予对所有IP的访问权限。只是功能(所以我假设管理员帐户相关?)。

以防万一:

在检查我的Firebase控制台设置后,我注意到我收到以下警告: “您的项目缺少用于Firebase Admin SDK的服务帐户” (尽管事实是,在项目的原始部署期间创建了一个项目。我将其称为firebase-adminsdk-A@proyect.iam.gserviceaccount.com)

因此,我经历了创建一个新帐户的过程:firebase-adminsdk-B@proyect.iam.gserviceaccount.com,并将密钥添加到功能中,但是,此新帐户未授予必要的权限在防火墙上。 此外,我现在在防火墙选项的“ firebase-adminsdk”下有两个firebase服务帐户:

firebase-adminsdk-A@proyect.iam.gserviceaccount.com

firebase-adminsdk-B@proyect.iam.gserviceaccount.com

在被选中后,都无法解决CORS问题。

我不知道是不是缺少在Firebase控制台上检测到第一个服务帐户的原因。

最后,如果这与某种意义相关:

我尝试了一些在网上找到的解决方案,例如检查“云功能调用程序”在云功能控制台上对功能的所有权限是否都设置为allUsers,然后重新部署所有功能;但这没什么区别。

https://github.com/firebase/firebase-functions/issues/645#issuecomment-605835353) (https://cloud.google.com/functions/docs/securing/managing-access-iam#allowing_unauthenticated_function_invocation

此外,阅读后:

https://firebase.google.com/docs/functions/callable

“警告:默认情况下,与版本低于7.7.0的任何Firebase CLI一起部署的新HTTP和HTTP可调用函数均为私有,并在调用时引发HTTP 403错误。在部署任何新功能之前,要么明确公开这些功能,要么更新Firebase CLI。”

我将Firebase CLI更新到最新版本,并再次重新部署了所有功能。

很抱歉,我认为文字问题似乎是相当具体的,因此我想尽可能详尽。 (Firebase支持无法为我提供解决方案)

谢谢。

2 个答案:

答案 0 :(得分:0)

不确定我是否理解正确,但是我认为最简单的解决方案是使用VPC Serverles connector

创建 VPC无服务器连接器时,诸如App Engine,Cloud Run和Cloud Functions等资源可以连接到VPC内部的资源,如VM。

根据我所读的内容,您在使用防火墙设置,服务帐户和所有其他内容时遇到了麻烦。因此,当您创建 VPC无服务器连接器(可以按照此guide创建一个)时,可以使用它使用其内部IP连接到VM,例如:

假设您有2个具有内部IP 10.128.0.210.128.0.3的VM。然后,将CF use the VPC Serverless Connector设置为将流量输出到内部资源,您可以使用来自功能代码的VM的内部IP调用这些VM(在创建函数时,请记住使用Route only requests to private IPs through the VPC connector,因此只有流量才能到达内部资源使用VPC。

对于防火墙,您只需要从创建时配置的 VPC无服务器连接器 CIDR授予访问权限。例如,如果使用10.8.0.0/28,则只需授予在选定端口中该CIDR范围内对VM的访问权限(例如808080443或任何您需要使用的内容),则不必允许对您不理想的0.0.0.0/0进行访问。

尝试一下,希望对您有所帮助:

答案 1 :(得分:0)

我遇到了类似的问题并找到了一个简单的解决方案 - 部署的 onCall 云函数返回 403,并且浏览器显示“缺少 CORS 标头‘Access-Control-Allow-Origin’”。

事实证明,如果我在函数的权限选项卡中手动授予“allUsers”角色“Cloud Function Invoker”,则该函数可以正常工作: enter image description here