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

时间:2017-03-12 16:39:25

标签: javascript firebase firebase-admin google-cloud-functions

在下面的示例中,有没有办法获取写入/ 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 个答案:

答案 0 :(得分:50)

更新的答案(v1.0.0 +)

@Bery's answer above所述,Firebase Functions SDK的版本1.0.0引入了一个新的context.auth对象,其中包含uid等身份验证状态。有关详细信息,请参阅"New properties for user auth information"

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

是的,这在技术上是可行的,尽管目前没有记录。 uidevent.auth对象一起存储。从管理员情境(例如,从Firebase控制台数据查看器或管理SDK)触发数据库云功能时,event.auth的值为:

{
  "admin": true
}

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

{
  "admin": false
}

最后,当从authed(而非admin)引用触发数据库云功能时,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;

    // ...
});

请注意,在上面的代码中,即使uidnullisAdmin仍为true。您的确切代码取决于您的使用案例。

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

答案 1 :(得分:11)

自Firebase功能达到1.0版本以来,此行为不再是未记录的,但已经轻微改变。请务必阅读the docs

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

  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.
  // ...
});