首页 文章

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

提问于
浏览
31

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

  • 48

    自从Firebase功能达到1.0版本以来,此行为不再是未记录的,但已经轻微改变 . 一定要阅读the docs .

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

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

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

    {
      "admin": true
    }
    

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

    {
      "admin": false
    }
    

    最后,当从authed而不是admin引用触发数据库 Cloud 功能时, 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;
    
        // ...
    });
    

    请注意,在上面的代码中, uid 将是 null ,即使 isAdmintrue . 您的确切代码取决于您的使用案例 .

    WARNING: 这是目前没有记录的行为,所以我会给出我惯常的警告"undocumented features may be changed at any point in the future without notice and even in non-major releases."

相关问题