如何让 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 不断让我的设备失败