我试图在云函数中获得通过firebase web sdk验证的用户的UID。cloud函数由cloud FireStore的onwrite
事件触发。
当登录用户正在创建/更新CAFE中的项目时,会触发此功能。身份验证由firebase auth
处理。安全规则仅对登录的用户启用写操作。因此该事件可以绑定到用户。
export const cfun = functions.firestore.document('cafes/{cafeId}/items/{itemId}').onWrite(async event => {
// trying to get the uid here
})
文档中有处理userId
的示例,但在所有这些情况下,userId都是文档路径的一部分。但是在这个模型中,用户不是路径的一部分,因为一个咖啡馆可能有多个所有者,因此可以被许多用户操纵。因此不能将userId添加到路径中。
这似乎是无服务器架构的常见情况。
更新:firestore触发的函数没有填充event.auth
。寻找关于以下需求建模的建议。
在数据模型中,我有咖啡馆和店主。每个咖啡馆可以由多个业主拥有,一个咖啡馆可以在稍后的阶段转让给另一个业主。因此,咖啡馆被建模为/cafes/{cafeId}
和属于咖啡馆的所有东西都被建模为/cafes/{cafeId}/items/{itemId}
等。我们还需要根据不同的参数查询咖啡馆,如果在用户下面建模,就会变得很困难。由于这些原因,不能将cafe建模为/users/{userId}/cafes/{cafeId}
。
就安全规则而言,我可以使用get(<>)
来控制写访问,以确定谁获得对cafes的写访问权限。保安没有问题。
我觉得执行上下文应该提供所有可用的信息,并让开发人员处理适合他们用例的信息。对于无服务器应用程序,userId是必须的。
如果函数中未提供event.auth
,则此限制将强制不属于用户的项建模/users/{userId}/
,只是为了访问云函数中的userId。这感觉不自然。
此外,现在还无法确定是否由于在控制台中执行的更改而触发了云功能。对于firebase数据库触发函数可用的event.auth
信息将非常适合处理所有情况。
任何关于如何重新模型这个案例的建议也是赞赏的。
先谢谢你,
由于Cloud Functions1.0,您可以获得如下所示的UID
exports.dbCreate = functions.database.ref('/path').onCreate((snap, context) => {
const uid = context.auth.uid;
const authVar = context.auth;
});
下面是FB团队针对所有CF1.0更改的一篇精彩文章:https://firebase.google.com/docs/functions/beta-v1-diff#event_parameter_split_into_data_and_context
context.auth
的数据可以在这里找到:https://firebase.google.com/docs/firestore/reference/security/#properties