从第一代迁移到第二代后,Firebase 在可调用云函数上出现未经身份验证的错误

问题描述 投票:0回答:2

我有一个 firebase 项目,用作 flutter 应用程序的后端。身份验证过程由 Firebase 身份验证管理,我使用可调用的云函数来执行一些任务。

几天前,我意识到我正在使用第一代云函数,我决定切换到第二代云函数。执行此操作后,所有可调用的云函数都停止工作,并出现错误 [firebase_functions/unauthenticated] UNAUTHENTICATED。客户端调用该函数的代码如下:

FirebaseFunctions functions = FirebaseFunctions.instanceFor(region: 'europe-west1');
final HttpsCallable functionExample = functions.httpsCallable('functionExample');
functionExample.call().then((result) {
   debugPrint('Function successfull');
})

其中 FirebaseFunctions 来自 cloud_functions flutter 库。

经过一番调查,我了解到该错误是由于在第二代云函数中部署并在 Google Cloud 内部运行而引起的,因此来自 flutter 客户端应用程序的 Firebase 身份验证用户不是有效的 google cloud 用户,这就是为什么我得到未经身份验证的错误消息。

那么我的问题是如何克服这个问题但仍然保证其安全。我知道我可以在谷歌云中的函数权限中将云函数调用者角色赋予“allUsers”,以便每个人都可以调用,但我想保留一种方法,其中该函数需要身份验证,但 Firebase 经过身份验证的用户是有效的。

我正在考虑为 Firebase 经过身份验证的用户生成一个对 Google Cloud 有效的令牌,甚至让 Google Cloud 知道 Firebase 用户并将他们视为 Google Cloud 用户。

我还想避免在云函数内部进行硬编码检查,以便查看用户是否拥有 firebase 有效令牌。

希望有人遇到过同样的问题,并以一种并非所有人都可以拨打电话的方式解决这个问题。

编辑:我刚刚注意到我正在使用 Identity Platform,所以我的用户也在 Google Cloud 中,那么我如何通过 Identity Platform 对用户进行身份验证。我是否需要停止使用 Firebase 身份验证并使用另一个直接针对 GCP 的库?

node.js firebase google-cloud-functions
2个回答
0
投票

我刚刚注意到我正在使用 Identity Platform,所以我的用户也在 Google Cloud 中,那么我如何通过 Identity Platform 对用户进行身份验证。我是否需要停止使用 Firebase 身份验证并使用另一个直接针对 GCP 的库?

Google Cloud Identity Platform 和 Firebase 身份验证在幕后使用完全相同的基础设施。它们共享完全相同的用户数据库,唯一的区别在于定价和功能集。因此,如果您的 Firebase 项目有现有用户,这些用户也会显示在 Cloud Identity Platform 中(反之亦然)。


0
投票

“allUsers”的云函数调用者角色对于从 Web 和移动前端调用的可调用类型函数是绝对必要的。 您应该注意,GCP“allUsers”与登录您的应用的 Firebase Auth 用户没有任何关系。 这是一个 GCP IAM 角色,表明可以在没有服务帐户许可的情况下调用该函数(这确实是您在此处尝试执行的操作)。

如果您想控制 Firebase Auth 用户可以或不可以使用可调用函数完成哪些操作,您需要在该函数中编写一些代码来检查调用该函数的 Firebase Auth 用户,并决定允许他们执行哪些操作。 文档中提供了一个简短的示例:

// Message text passed from the client.
const text = request.data.text;
// Authentication / user information is automatically added to the request.
const uid = request.auth.uid;
const name = request.auth.token.name || null;
const picture = request.auth.token.picture || null;
const email = request.auth.token.email || null;

因此,使用

request.auth
中提供的数据,您应该能够找出哪个用户从您的网络或移动应用程序调用了该功能,并决定他们能够完成什么。

© www.soinside.com 2019 - 2024. All rights reserved.