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 => {
...
});
Je me débattais dessus depuis un moment et j'ai finalement contacté le support technique de Firebase:
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.
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;
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.
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)
});