【问题标题】:Cannot impersonate user with firebase-admin during firestore calls在 firestore 调用期间无法使用 firebase-admin 模拟用户
【发布时间】:2020-11-27 08:42:52
【问题描述】:

根据此处所写的内容,他们正在使用新的 Firebase 管理应用实例“模拟用户”,因此当他们执行写入/读取操作时,将为该用户触发安全规则。

https://firebase.google.com/docs/database/extend-with-functions

我正在尝试为 Firestore 做同样的事情,但它似乎不起作用。

目标

我通过托管为云功能的快速后端读取/写入 Firestore。 我不想在该后端实施手动安全规则。

我想让 firebase-admin 应用程序实例“作为用户”运行,以便适当地触发 firestore 安全规则,并且我可以在安全规则中统一我的安全性。

这是我正在使用的代码:

1。获取管理应用选项

export function getLocalAdminAppOptions(): admin.AppOptions {
    // we are running locally
    const serviceAccount: admin.ServiceAccount = {
        clientEmail: CLIENT_EMAIL,
        projectId: PROJECT_ID,
        privateKey: (PRIVATE_KEY || "").replace(/\\n/g, "\n")
    }
    return {
        credential: admin.credential.cert(serviceAccount),
        databaseURL: DATABASE_URL
    }
}

2。添加模拟选项并实例化管理应用程序

import * as Admin from "firebase-admin"
import * as Functions from "firebase-functions"

const appOptions = getLocalAdminAppOptions()
const token: Admin.auth.DecodedIdToken = await Admin.auth().verifyIdToken(req.idToken)
const authOverwrite: Functions.EventContext["auth"] = {
    token,
    uid: req.authUser.uid
}
appOptions.databaseAuthVariableOverride = authOverwrite
const uniqueAppName = "adminAppAsUser:" + req.authUser.uid
const adminAppAsUser = Admin.initializeApp(appOptions, uniqueAppName)

3。使用模拟应用实例进行 Firestore 调用

const snap = await adminAppAsUser
  .firestore()
  .collection(`test`)
  .doc("test")
  .get()

return snap.data()

问题:

adminAppAsUser 似乎仍然是具有完全访问权限的管理应用程序,忽略了安全规则。

错误的解决方法

我确实设法找到了一个“hacky”解决方法: 在我的后端中为网络创建一个新的 Firebase 实例,并使用自定义令牌进行签名,然后使用它来访问 Firestore。

此解决方法的问题:每次运行云功能时,signInWithCustomToken 需要 800 毫秒!

解决方法的代码:

const uniqueAppName = "adminAppAsUser:" + req.authUser.uid
const adminAppAsUser = Firebase.initializeApp(configs.dev, uniqueAppName)
const token = await Admin.auth().createCustomToken(req.authUser.uid)
await adminAppAsUser.auth().signInWithCustomToken(token)

【问题讨论】:

    标签: node.js firebase express google-cloud-firestore firebase-admin


    【解决方案1】:

    我正在尝试为 Firestore 做同样的事情,但它似乎不起作用。

    根本不支持。您可以通过 RTDB 获得的模拟不适用于 Firestore。

    在使用 Firestore 的任何后端 SDK 时,用于初始化它的服务帐号的权限将始终绕过安全规则,而是依赖于 Google Cloud IAM 权限。

    另见:

    【讨论】:

    • 嗨@Doug Stevenson!感谢您的回答。在这种情况下,您有什么建议可以最好地手动实施后端的安全规则吗?使用函数手动编写所有内容似乎容易出错。您是否知道某种库可以将 Firestore 安全规则转换为我们可以使用 Admin-SDK 在后端轻松执行的东西?
    • 不,由您在后端代码中实施所需的任何检查。
    • 感谢您的评论!我想知道,如果我在后端使用 Firebase Web SDK,并通过signInWithCustomToken 对其进行身份验证,则需要 800 毫秒。有什么办法可以加快这个速度吗? (因为 Web SDK确实使用安全规则;))
    • 听起来你有一个新问题要发布。
    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2021-10-16
    • 2021-06-21
    • 2019-02-02
    • 2019-12-02
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多