Firestore - 云功能 - 获取uid

sow*_*dri 10 firebase firebase-authentication google-cloud-functions google-cloud-firestore

我正在尝试在云功能中获取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
})
Run Code Online (Sandbox Code Playgroud)

文档中有一些例子可以处理userId,但在所有这些情况下,userId都是文档路径的一部分.但是在这个模型中,用户不是路径的一部分,因为咖啡馆可能有多个所有者,因此可能被许多用户操纵.因此,不能将userId添加到路径中.

它看起来像无服务器架构的常见情况.

#

更新:firestore触发的功能尚未event.auth填充.寻找有关以下要求建模的建议.

在数据模型中,我有咖啡馆和老板.每个咖啡馆可以由许多所有者拥有,并且咖啡馆可以在稍后阶段转移给其他所有者.所以网吧建模为/cafes/{cafeId}一切属于网吧作为/cafes/{cafeId}/items/{itemId}等,我们还需要根据不同的PARAMS查询网吧,如果仿照下面的用户来说,它变得困难.由于这些原因,咖啡馆不能被建模为/users/{userId}/cafes/{cafeId}.

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

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

如果event.auth在功能没有提供,那么这个限制将迫使不属于用户建模项目/users/{userId}/<item_name>/{itemId}只是为了在云计算功能的访问userid的缘故.这感觉不自然.

此外,由于控制台中执行的更改,目前无法确定是否触发了云功能.的event.auth,可用于火力数据库触发的功能信息将是完美处理所有案件.

任何有关如何改造此案例的建议也值得赞赏.

#

提前致谢,

小智 12

我一直面临类似的问题.在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;
}
Run Code Online (Sandbox Code Playgroud)

在谷歌/ Firestore人员将"auth"对象添加到云功能之前,我没有看到任何其他的解决方法,但我希望听到不同的声音.

  • 是否有任何更新能够检索触发事件的人的uid?我想任何对auth的引用都会出错,例如auth.UserInfo()等. (2认同)

Jür*_*ter 5

从 Cloud Functions 1.0 开始,您可以像这样获取 UID

exports.dbCreate = functions.database.ref('/path').onCreate((snap, context) => {
  const uid = context.auth.uid;
  const authVar = context.auth; 
});
Run Code Online (Sandbox Code Playgroud)

以下是 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

  • 这对于 Firestore(不是实时数据库)也正确吗?context.auth 是为实时数据库列出的,但不是为 Firestore 列出的,当我尝试使用它时遇到错误。console.log(context.auth) 打印“未定义”(2018 年 7 月) (2认同)
  • 根据 /sf/answers/3487905921/ 和 /sf/answers/3480623541/,截至 2018 年 6 月,这在 Firestore 中不起作用 (2认同)