Firestore - 云功能 - 获取uid

时间:2017-11-06 03:55:26

标签: 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
})

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

它似乎是无服务器架构的常见情况。

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

在数据模型中,我有咖啡馆和老板。每个咖啡馆可以由许多所有者拥有,并且咖啡馆可以在稍后阶段转移给其他所有者。因此,咖啡馆被建模为/cafes/{cafeId}以及属于咖啡馆的所有内容/cafes/{cafeId}/items/{itemId}等。 我们还需要根据不同的参数查询咖啡馆,如果在用户下方建模则变得困难。由于这些原因,咖啡馆无法建模为/users/{userId}/cafes/{cafeId}

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

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

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

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

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

提前致谢,

2 个答案:

答案 0 :(得分:11)

我一直面临类似的问题。在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”对象添加到云端功能之前,我没有看到任何其他解决方法,但我希望能听到不同的声音。

答案 1 :(得分:2)

自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