如何让 Firebase Functions 充当用户而不是管理员?

Posted

技术标签:

【中文标题】如何让 Firebase Functions 充当用户而不是管理员?【英文标题】:How to make Firebase Functions act as a user instead of being an admin? 【发布时间】:2019-02-10 02:00:58 【问题描述】:

我的客户端应用正在通过 Firebase Functions 创建的 API 访问 Firestore。但是,Firebase 函数会导入 firebase-admin,它会绕过所有定义的安全规则。有什么方法可以让我的 HTTP 触发器函数充当特定用户(例如,通过将访问令牌从客户端传递到服务器),以便函数也可以在 Firebase 函数的影响下工作。

【问题讨论】:

【参考方案1】:

目前没有办法做到这一点。适用于节点的 Firestore SDK 无法将其对数据库的访问范围限定为特定的经过身份验证的用户。

请注意,这与实时数据库 SDK 不同,后者允许您使用scope to a uid。

【讨论】:

因为我使用的是admin SDK。所以,SDK 基本上可以访问任何节点。即使我用 uid 构建了我的数据库,我认为我无法控制访问。当然,我可以在 Firebase Functions 中控制手动检查逻辑,但我想知道我是否可以在 DB 级别实现它。有什么线索吗? “在数据库级别”是什么意思?正如我所说,如果您使用的是 Admin SDK,则无法控制访问。 我的意思是,如果有一种方法可以代表用户查询数据库,以便像客户端应用程序调用一样处理请求(即使它在 Firebase 函数中运行)不使用firebase-admin 正如我的回答所说,Firestore 目前无法做到这一点。 我向 Firebase 提交了一个功能请求,以允许管理员 sdk 从客户端获取可选的 firebase 身份验证令牌,并像该用户一样发出 firestore 请求,因此安全规则生效。我的用例是我想在 Cloud Run 中运行一个 GraphQL 层,该层位于 firestore 和已登录的 Web 应用程序客户端之间【参考方案2】:

我认为可以通过 admin-sdk 访问 Firestore,但如果您使用 REST APIs to access Firestore,则将其范围限定为登录用户。

对于身份验证,Cloud Firestore REST API 接受 Firebase 身份验证 ID 令牌或 Google Identity OAuth 2.0 令牌。您提供的令牌会影响您请求的授权:

使用 Firebase ID 令牌对来自应用用户的请求进行身份验证。对于这些请求,Cloud Firestore 使用 Cloud Firestore 安全规则来确定请求是否获得授权。

【讨论】:

【参考方案3】:

您可以从req.headers 读取不记名令牌,然后使用admin.auth().verifyIdToken(token) 进行验证,请参阅https://www.toptal.com/firebase/role-based-firebase-authentication

【讨论】:

以上是关于如何让 Firebase Functions 充当用户而不是管理员?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 SwiftUI 应用程序使用 Firebase Functions 模拟器而不是生产环境?

如何在 firebase-functions 中使用 firebase.auth()?

如何在 Cloud Functions for Firebase 中访问多个实时数据库实例

Firebase Functions AppCheck 不断让我的设备失败

如何访问 Node.js 服务器上 Functions 内的 Firebase 存储?

如何在 Firebase Cloud Functions 中确认 PubSub 消息?