web-dev-qa-db-fra.com

Obtenir l'ID utilisateur à partir d'un déclencheur de base de données dans Cloud Functions for Firebase?

Dans l'exemple ci-dessous, existe-t-il un moyen d'obtenir l'uid de l'utilisateur qui a écrit dans/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);
});
30
Bilal Soomro

Depuis que les fonctions Firebase ont atteint la version 1.0, ce comportement n'est plus documenté mais a légèrement changé. Assurez-vous de lire les documents .

Le contexte a été ajouté aux fonctions cloud et vous pouvez l'utiliser comme ceci

  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

RÉPONSE MISE À JOUR (v1.0.0 +) :

Comme indiqué dans @ réponse de Bery ci-dessus , version 1.0.0 du SDK Firebase Functions a introduit un nouveau context.auth objet qui contient l'état d'authentification tel que uid. Voir "Nouvelles propriétés pour les informations d'authentification des utilisateurs" pour plus de détails.

RÉPONSE ORIGINALE (avant v1.0.0):

Oui, cela est techniquement possible, bien qu'il ne soit pas actuellement documenté. Le uid est stocké avec le event.auth objet. Lorsqu'une fonction de cloud de base de données est déclenchée à partir d'une situation d'administration (par exemple, à partir de la visionneuse de données de la console Firebase ou d'un SDK d'administration), la valeur de event.auth est:

{
  "admin": true
}

Lorsqu'une fonction de cloud de base de données est déclenchée à partir d'une référence non authentifiée, la valeur de event.data est:

{
  "admin": false
}

Et enfin, lorsqu'une fonction de cloud de base de données est déclenchée à partir d'une référence authentifiée, mais pas admin, le format de event.auth est:

{
  "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>"
  }
}

Compte tenu des informations ci-dessus, votre meilleur pari pour obtenir le uid de l'utilisateur qui a déclenché l'événement est de procéder comme suit:

exports.someFunction = functions.database.ref('/some/path')
  .onWrite(event => {
    var isAdmin = event.auth.admin;
    var uid = event.auth.variable ? event.auth.variable.uid : null;

    // ...
});

Notez simplement que dans le code ci-dessus, uid serait null même si isAdmin est true. Votre code exact dépend de votre cas d'utilisation.

AVERTISSEMENT: Il s'agit actuellement d'un comportement non documenté. même dans les versions non majeures. "

50
jwngr