Подтвердить что ты не робот

Получение идентификатора пользователя из триггера базы данных в облачных функциях для Firebase?

В приведенном ниже примере есть ли способ получить uid пользователя, который написал /messages/ {pushId}/original?

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);
});
4b9b3361

Ответ 1

С тех пор, как функции 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.
  // ...
});

Ответ 2

ОБНОВЛЕННЫЙ ОТВЕТ (v1.0. 0+):

Как отмечалось в ответе @Bery выше, версия 1.0.0 SDK Firebase Functions представила новый объект context.auth который содержит состояние аутентификации, такое как uid. Смотрите "Новые свойства для информации об аутентификации пользователя" для более подробной информации.

ОРИГИНАЛЬНЫЙ ОТВЕТ (до v1.0.0):

Да, это технически возможно, хотя в настоящее время это не задокументировано. uid хранится вместе с event.auth объекта. Когда облачная функция базы данных запускается из ситуации администратора (например, из средства просмотра данных Firebase Console или из пакета SDK администратора), значением event.auth является:

{
  "admin": true
}

Когда Облачная функция базы данных запускается из неаутентифицированной ссылки, значение event.data равно:

{
  "admin": false
}

И наконец, когда функция Cloud 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 даже если isAdmin имеет значение true. Точный код зависит от вашего варианта использования.

ПРЕДУПРЕЖДЕНИЕ. В настоящее время это недокументированное поведение, поэтому я дам свое обычное предупреждение о том, что "недокументированные функции могут быть изменены в любой момент в будущем без уведомления и даже в неосновных выпусках".