【发布时间】: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