web-dev-qa-db-fra.com

Obtenir l'identifiant de l'utilisateur à partir d'un déclencheur Firestore dans les fonctions de cloud pour Firebase?

Dans l'exemple ci-dessous, existe-t-il un moyen d'obtenir l'identifiant de l'utilisateur (uid) de l'utilisateur qui a écrit dans 'offers/{offerId}'? J'ai essayé de faire comme décrit ici mais cela ne fonctionne pas dans Firestore.

exports.onNewOffer = functions.firestore
  .document('offers/{offerId}')
  .onCreate(event => {
    ...
});
5
Gabriel Bessa

Je me débattais dessus depuis un moment et j'ai finalement contacté le support technique de Firebase:

 I was trying to achieve this.

event.auth.uid n'est pas défini dans l'objet événement pour les déclencheurs de base de données Firestore. (Cela fonctionne pour les déclencheurs de base de données en temps réel)

Lorsque j'ai console.log(event), je ne trouve aucune auth dans le résultat.

La réponse officielle du support:

Désolé, l'authentification n'est pas encore ajoutée au SDK Firestore. Nous l'avons répertorié dans les prochaines fonctionnalités.

Gardez un œil sur nos notes de publication pour d’autres mises à jour.

J'espère que cela économise quelques heures à quelqu'un.

15
Tim

Comme déjà suggéré ci-dessus, la solution consiste à ajouter un champ user_id avec les données elles-mêmes, puis à le lire sur le serveur.

L'inconvénient de cette approche sera une faille de sécurité. Comme nous ne vérifions pas l'identifiant de l'utilisateur sur le serveur, tout autre utilisateur pourra emprunter l'identité d'autres utilisateurs en envoyant leur identifiant avec les données.

Pour les applications critiques pour la sécurité, la solution consiste à utiliser des règles de sécurité pour vérifier que le bon user_id a été envoyé avec les données.

allow write: if resource.data.user_id == request.auth.uid;
2
Akshay Jain

En attendant que cela soit ajouté aux fonctions de mémoire de stockage, une solution consiste à ajouter le user_id en tant que champ lors de la création d'un document, puis de le supprimer après. Vous pouvez ensuite le saisir dans la fonction onCreate puis, après l'avoir utilisé pour son usage, tout en restant dans la fonction, supprimez simplement le champ de ce document.

1
askilondz

Qu'en est-il de snap._fieldsProto.uid.stringValue

Exemple:

exports.hello = functions.firestore.document('hello/{worldId}').onCreate((snap, context) => {
   console.log(snap._fieldsProto.uid.stringValue)
});
0
l2aelba