从 Cloud Functions for Firebase 中的数据库触发器获取用户 ID?

IT技术 javascript firebase firebase-realtime-database google-cloud-functions
2021-02-05 20:30:00

在下面的示例中,有没有办法获取写入 /messages/{pushId}/original 的用户的 uid?

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
.onWrite(event => {
  // Grab the current value of what was written to the Realtime Database.
  const original = event.data.val();
  console.log('Uppercasing', event.params.pushId, original);
  const uppercase = original.toUpperCase();
  // You must return a Promise when performing asynchronous tasks inside a Functions such as
  // writing to the Firebase Realtime Database.
  // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
  return event.data.ref.parent.child('uppercase').set(uppercase);
});
2个回答

更新的答案(v1.0.0+)

上面@Bery 的回答所述1.0.0Firebase Functions SDK 的版本引入了一个新context.auth对象,其中包含身份验证状态,例如uid. 有关更多详细信息,请参阅“用户身份验证信息的新属性”

原始答案(v1.0.0 之前):

是的,这在技术上是可行的,尽管目前没有记录。uid存储与所述event.auth对象。当数据库云功能从管理情况(例如,从 Firebase 控制台数据查看器或从 Admin SDK)触发时,其值为event.auth

{
  "admin": true
}

当从未经身份验证的引用触发数据库云功能时,的值为event.data

{
  "admin": false
}

最后,当一个数据库云功能是从一个经过身份验证的而不是管理员的引用触发时,格式event.auth是:

{
  "admin": false,
  "variable": {
    "provider": "<PROVIDER>",
    "provider_id": "<PROVIDER>",
    "user_id": "<UID>",
    "token": {
      // Decoded auth token claims such as sub, aud, iat, exp, etc.
    },
    "uid": "<UID>"
  }
}

根据上述信息,获取uid触发事件的用户的最佳选择是执行以下操作:

exports.someFunction = functions.database.ref('/some/path')
  .onWrite(event => {
    var isAdmin = event.auth.admin;
    var uid = event.auth.variable ? event.auth.variable.uid : null;

    // ...
});

只要注意,在上面的代码,uidnull即使isAdmintrue您的确切代码取决于您的用例。

警告:这是目前未记录的行为,所以我会给出我通常的警告:“未记录的功能可能会在未来的任何时候更改,恕不另行通知,甚至在非主要版本中也是如此。”

看起来语法随着 v1.0.0 的发布而改变,现在记录在案:firebase.google.com/docs/functions/beta-v1-diff
2021-03-14 20:30:00
任何迹象表明这将改变或保持?这对我的用例来说是理想的,但如果仍然可以改变,我不想使用它。
2021-03-17 20:30:00
有什么理由没有为此提供公共 API?似乎是一个合理的用例(我们正在探索 FB 作为后端,这是一个主要的悬而未决的问题)。
2021-03-24 20:30:00
当 event.auth 不是来自管理员时,如果其他人想知道这是整个对象:pastebin.com/CgyivDRm
2021-03-27 20:30:00
添加了一个错误/请求来记录这个并使其成为官方公共 API github.com/firebase/firebase-functions/issues/133
2021-04-10 20:30:00

自从 Firebase 函数达到 1.0 版以来,这种行为不再没有记录,而是略有改变。请务必阅读文档

上下文已添加到云功能中,您可以像这样使用它

  exports.dbWrite = functions.database.ref('/path/with/{id}').onWrite((data, context) => {
  const authVar = context.auth; // Auth information for the user.
  const authType = context.authType; // Permissions level for the user.
  const pathId = context.params.id; // The ID in the Path.
  const eventId = context.eventId; // A unique event ID.
  const timestamp = context.timestamp; // The timestamp at which the event happened.
  const eventType = context.eventType; // The type of the event that triggered this function.
  const resource = context.resource; // The resource which triggered the event.
  // ...
});