Получение идентификатора пользователя из триггера базы данных в облачных функциях для 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);
});
Ответы
Ответ 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
. Точный код зависит от вашего варианта использования.
ПРЕДУПРЕЖДЕНИЕ. В настоящее время это недокументированное поведение, поэтому я дам свое обычное предупреждение о том, что "недокументированные функции могут быть изменены в любой момент в будущем без уведомления и даже в неосновных выпусках".