Firestore-云函数-获取uid



我正试图在云函数中获取firebase-web-sdk验证的用户的UID。云功能由云火库onWrite事件触发。

当登录用户正在创建/更新咖啡馆的项目时,会触发此功能。身份验证由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}等等。我们还需要根据不同的参数查询咖啡馆,如果以用户为模型,这将变得困难。由于这些原因,咖啡馆不能被建模为/users/{userId}/cafes/{cafeId}

就安全规则而言,我可以使用get(<>)来控制写访问,以确定谁可以对咖啡馆进行写访问。安全性没有问题。

我觉得执行上下文应该提供所有可用的信息,并让开发人员根据他们的用例进行适当的处理。对于无服务器应用程序,userId是必须的。

如果函数中未提供event.auth,则此限制将强制不属于用户的项目建模为/users/{userId}/<item_name>/{itemId},只是为了访问云函数中的userId。这感觉不太自然。

此外,目前还无法确定是否由于控制台中执行的更改而触发了云功能。可用于firebase数据库触发函数的event.auth信息将非常适合处理所有情况。

任何关于如何改造这个案例的建议也将受到赞赏。

#

提前感谢

我也遇到过类似的问题。在Firebase中,这很容易-你只需从event.auth中获取数据。我认为这只是一个尚未实现的功能,而我们正处于Firestore的测试阶段。将用户id添加到路径中不会像您之前提到的那样起作用,因为它会根据进行更新的用户不断变化。

我的场景是,我想在正在更新的对象中创建一个"lastUpdatedBy"字段。如果我们允许客户端在有效负载中发送lastUpdatedBy字段,这可能会被试图冒充他人的流氓客户端(即拥有已验证帐户的人)滥用。因此,在Firebase中,我们依靠云函数来填充数据更改事件的此字段。

我的解决方法是允许客户端插入"lastUpdatedBy"字段,但另外使用Firestore规则来验证负载中的userId是否与登录用户的userId匹配,否则拒绝写入请求。

类似于:

match /collectionA/{docId} {
allow update: if request.resource.data.lastUpdatedBy == request.auth.uid;
}

在Google/Firestore将"auth"对象添加到云功能之前,我看不到任何其他解决方案,但我很乐意听到不同的解决方案。

由于Cloud Functions 1.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

相关内容

  • 没有找到相关文章

最新更新