以下の例では、/ 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);
});
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.
// ...
});
更新された回答(v1.0.0 +):
@ Beryの上記の回答 で述べたように、Firebase Functions SDKのバージョン1.0.0
は、uid
などの認証状態を含む新しい context.auth
オブジェクトを導入しました。 "ユーザー認証情報の新しいプロパティ" を参照してください。
オリジナルの回答(v1.0.0以前):
はい、現時点では文書化されていませんが、技術的には可能です。 uid
はevent.auth
オブジェクトと共に保存されます。データベースクラウド機能が管理状況(たとえば、Firebase Consoleデータビューアーまたは管理SDK)からトリガーされる場合、event.auth
の値は次のとおりです。
{
"admin": true
}
認証されていない参照からDatabase Cloud Functionがトリガーされる場合、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;
// ...
});
上記のコードでは、uid
がnull
であっても、isAdmin
はtrue
になります。正確なコードはユースケースによって異なります。
警告:これは現在文書化されていない動作なので、「文書化されていない機能は将来予告なしに変更される可能性があります。メジャーでないリリースでも。」