34 votes

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

Dans l'exemple ci-dessous, y a-t-il un moyen d'obtenir l'uid de l'utilisateur qui a écrit à /messages/{pushId}/original?

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
.onWrite(event => {
  // Obtenez la valeur actuelle de ce qui a été écrit dans la base de données en temps réel.
  const original = event.data.val();
  console.log('Mise en majuscule de', event.params.pushId, original);
  const uppercase = original.toUpperCase();
  // Vous devez renvoyer une promesse lorsque vous effectuez des tâches asynchrones à l'intérieur d'une fonction comme
  // écrire dans la base de données en temps réel de Firebase.
  // Le fait de définir un "uppercase" frère dans la base de données en temps réel renvoie une promesse.
  return event.data.ref.parent.child('uppercase').set(uppercase);
});

49voto

jwngr Points 3172

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

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

RÉPONSE ORIGINALE (avant v1.0.0):

Oui, c'est techniquement possible, bien que cela ne soit pas actuellement documenté. Le uid est stocké avec l'objet event.auth. Lorsqu'une Fonction Cloud de Base de Données est déclenchée depuis une situation d'administration (par exemple, depuis l'inspecteur de données de la Console Firebase ou depuis un SDK d'administration), la valeur de event.auth est :

{
  "admin": true
}

Lorsqu'une Fonction Cloud de Base de Données est déclenchée depuis une référence non authentifiée, la valeur de event.data est :

{
  "admin": false
}

Enfin, lorsqu'une Fonction Cloud de Base de Données est déclenchée depuis une référence authentifiée, mais non administrative, le format de event.auth est :

{
  "admin": false,
  "variable": {
    "provider": "",
    "provider_id": "",
    "user_id": "",
    "token": {
      // Revendications du jeton d'authentification décodé telles que sub, aud, iat, exp, etc.
    },
    "uid": ""
  }
}

Étant donné les informations ci-dessus, votre meilleur choix pour obtenir le uid de l'utilisateur ayant déclenché l'événement est le suivant :

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 : Ce comportement est actuellement non documenté, donc je donne ma mise en garde habituelle : "les fonctionnalités non documentées peuvent être modifiées à tout moment à l'avenir sans préavis et même dans des versions non majeures".

5 votes

Toute raison pour laquelle il n'y a pas de API publique pour cela? Il semble qu'il s'agisse d'un cas d'utilisation raisonnable (nous explorons FB comme backend et c'était une question importante en suspens).

4 votes

Toute indication que cela va changer ou rester? C'est idéal pour mon cas d'utilisation, mais je ne veux pas l'utiliser si cela peut encore changer.

3 votes

Ajouté un bug/demande pour documenter cela et en faire une API publique officielle github.com/firebase/firebase-functions/issues/133

22voto

Bery Points 441

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

Un 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; // Informations d'authentification pour l'utilisateur.
  const authType = context.authType; // Niveau de permissions pour l'utilisateur.
  const pathId = context.params.id; // L'identifiant dans le chemin.
  const eventId = context.eventId; // Un identifiant d'événement unique.
  const timestamp = context.timestamp; // L'horodatage auquel l'événement s'est produit.
  const eventType = context.eventType; // Le type d'événement qui a déclenché cette fonction.
  const resource = context.resource; // La ressource qui a déclenché l'événement.
  // ...
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X