【问题标题】:CORS issue with onCall firebase cloud functions (GCP firewall rules)onCall firebase 云功能的 CORS 问题(GCP 防火墙规则)
【发布时间】: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


    【解决方案1】:

    不确定我是否理解正确,但我认为最简单的解决方案是使用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。然后,使 CF use the VPC Serverless Connector 用于内部资源的出口流量,您可以使用函数代码中的内部 IP 调用这些虚拟机(创建函数时请记住使用 Route only requests to private IPs through the VPC connector,因此只有到达内部资源的流量使用 VPC )。

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

    试试这个,希望对你有帮助:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-30
        • 2021-09-28
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多