web-dev-qa-db-ja.com

Cloud Functions for FirebaseのデータベーストリガーからユーザーIDを取得していますか?

以下の例では、/ 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);
});
30
Bilal Soomro

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

更新された回答(v1.0.0 +)

@ Beryの上記の回答 で述べたように、Firebase Functions SDKのバージョン1.0.0は、uidなどの認証状態を含む新しい context.auth オブジェクトを導入しました。 "ユーザー認証情報の新しいプロパティ" を参照してください。

オリジナルの回答(v1.0.0以前):

はい、現時点では文書化されていませんが、技術的には可能です。 uidevent.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;

    // ...
});

上記のコードでは、uidnullであっても、isAdmintrueになります。正確なコードはユースケースによって異なります。

警告:これは現在文書化されていない動作なので、「文書化されていない機能は将来予告なしに変更される可能性があります。メジャーでないリリースでも。」

50
jwngr