【发布时间】:2020-10-19 13:33:43
【问题描述】:
两年前,我部署了一个项目,其中涉及几个 firebase 云函数,其中一些通过使用数据库触发器调用,3 个通过使用“functions.https.onCall…”触发器(“可调用”函数)。
部署后一切正常,但是,在 2019 年 10 月左右,我不得不放弃该项目,并且我没有继续维护它。
目前,我有兴趣让网站再次完全正常运行,因此我按照收到的电子邮件中列出的所有必要步骤进行操作,例如更新我的 node.js 版本、firebase 管理员和函数版本等在;然而,在重新部署这些功能后,似乎只有那些具有数据库触发器的功能才能正常工作。 (请注意,这些功能从它们工作时就没有被修改过。)
我在浏览器控制台上遇到的错误是:
CORS 策略已阻止从源“https://.../functionName”获取“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 默认服务帐户)也没有启用连接。
总而言之:完成解决问题的唯一必要步骤是找到一种方法,让我可以在 GCP 中调用 VM,从 firebase 云功能无需授予对所有 IP 的访问权限;只是功能(所以我假设管理员帐户相关?)。
另外以防万一:
检查我的 Firebase 控制台设置后,我注意到我收到以下警告: “您的项目缺少与 firebase Admin SDK 一起使用的服务帐户” (尽管在项目的最初部署过程中,创建了一个。我称之为 firebase-adminsdk-A@proyect.iam.gserviceaccount.com)
所以,我完成了创建一个新帐户的过程:firebase-adminsdk-B@proyect.iam.gserviceaccount.com,并将密钥添加到功能中,但是,这个新帐户没有授予必要的权限在防火墙上。 此外,我现在在防火墙选项的“firebase-adminsdk”下有 2 个 firebase 服务帐户:
firebase-adminsdk-A@proyect.iam.gserviceaccount.com
firebase-adminsdk-B@proyect.iam.gserviceaccount.com
在被选中时,没有一个能解决 CORS 问题。
我不知道是否是在 firebase 控制台上没有检测到第一个服务帐户可能会导致问题。
最后,如果这有点相关:
我尝试了一些我在网上找到的解决方案,例如检查“Cloud Functions Invoker”的云功能控制台上的功能的所有权限是否设置为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 支持无法为我提供解决方案)
提前致谢。
【问题讨论】:
标签: firebase google-cloud-platform google-cloud-functions