J'essaie d'obtenir un utilisateur par e-mail, et cela semble assez simple. Je suis cette documentation

Il semble que mon code ne reconnaisse pas admin, ce que c'est normal car je n'ai défini nulle part. Ce que j'ai fait est de changer admin pour firebase, étant firebase:

import * as firebase from "firebase/app";

Et le code serait:

firebase.auth.getUserByEmail(participantEmail)

Mais j'obtiens l'erreur suivante:

La propriété 'getUserByEmail' n'existe pas sur le type 'Auth'.ts (2339)

Dois-je pré-installer quelque chose avant? Est-ce que je rate quelque chose?

Mon objectif est d'obtenir la liste de tous les e-mails des utilisateurs enregistrés sur mon système, puis de les filtrer, ou d'obtenir directement un utilisateur spécifique en regardant dans un e-mail (la deuxième option serait meilleure).

MISE À JOUR Maintenant, je crée une liste d'utilisateurs chaque fois que quelqu'un se connecte, mais je pense que Firebase restreint d'une manière ou d'une autre les informations.

S'inscrire

  registerUser(
    email: string,
    pass: string,
    displayName: string,
    photoURL: string
  ) {
    return new Promise((resolve, reject) => {
      this.afAuth.auth.createUserWithEmailAndPassword(email, pass).then(
        user => {
          resolve(user);
          user.updateProfile({
            displayName: displayName, // some displayName
            photoURL: photoURL
          });
          //NEEDS TO BE INSIDE UPDATEPROFILE
          this.insertUser(user);
        },
        err => {
          this.s_registerError = err.message;
          reject(err);
        }
      );
    });
  }

Insérer une liste

  //Insert a new bet
  insertUser(user) {
    console.log(user);
    console.log(user.email);
    console.log(user.displayName);

    this.listToStore = this.db.list("users");
    this.listToStore.push({
      photoURL: user.photoURL,
      email: user.email,
      displayName: user.displayName
    });
  }

Ici, j'obtiens la valeur de user dans tous ses champs, ce qui signifie que lorsque j'utilise console.log(user), je peux voir les displayName, email et {{X4 }}. Néanmoins, si j'essaye d'utiliser console.log(user.displayName) imprime null et si j'utilise console.log(user.email) imprime sa valeur.

J'ai pensé que cela pouvait être dû au fait que user.updateProfile() n'avait pas terminé, mais en fait, j'obtiens la valeur de user dans insertUser() sans aucun problème

0
Mario 20 mars 2019 à 12:32

3 réponses

Meilleure réponse

En faisant

import * as firebase from "firebase/app";

Dans votre application cliente, vous importez en fait le SDK JavaScript et non le SDK d'administration. C'est la manière correcte si cette importation est effectuée dans une application frontale, car le SDK Admin doit être utilisé "à partir d'un environnement de serveur sécurisé".

C'est pourquoi vous obtenez l'erreur Property 'getUserByEmail' does not exist on type 'Auth'.ts(2339), car cette méthode ne fait pas partie de Firebase Auth service.

Cela dit, vous devez savoir qu'avec le SDK JavaScript, il n'y a pas de moyen simple "d'obtenir la liste de tous les e-mails des utilisateurs enregistrés sur [votre] système".

La manière «habituelle» de le faire est de maintenir une liste d'utilisateurs dans votre base de données (RealTime Database ou Firestore) et d'interroger la base de données si nécessaire.

1
Renaud Tarnec 20 mars 2019 à 09:57

Seul le SDK Firebase Admin peut obtenir l'utilisateur à partir de l'authentification Firebase. Le SDK Admin ne doit être utilisé que dans un environnement sûr, c'est-à-dire un serveur backend.

Ce que vous pouvez faire, c'est utiliser un déclencheur de création d'authentification des fonctions cloud Firebase, puis écrire l'adresse e-mail dans votre base de données Firebase / Firestore. Ensuite, vous pouvez interroger votre base de données dans l'application angular pour filtrer les utilisateurs en fonction sur l'adresse e-mail.

Une autre option consiste à avoir une fonction HTTPS à laquelle vous pouvez envoyer l'adresse e-mail et la fonction peut ensuite utiliser admin sdk pour extraire l'utilisateur de l'authentification Firebase.

0
Umar Hussain 20 mars 2019 à 09:58

Comme vous l'avez souligné: getUserByEmail n'est qu'une partie du SDK d'administration et vous ne pourrez pas l'appeler à partir de votre code Angular.

Si votre application a pour concept de rechercher ou de gérer d'autres utilisateurs, vous pouvez considérer que les utilisateurs font partie de vos données d'entreprise. Copiez et créez donc les données de profil lors de la création du compte d'authentification (vous pouvez en savoir plus ici).

Vous pouvez trouver plus d'informations sur les informations disponibles sur l'objet utilisateur Firebase dans la documentation. Copiez simplement ce dont vous avez besoin et stockez-le dans une collection que vous pouvez interroger à partir de votre application Angular.

export const createUserDoc = functions.auth.user().onCreate(event => {
    const firebaseUser = event.data;
    const user = {
        name: firebaseUser.displayName,
        email: firebaseUser.email,
        photoUrl: firebaseUser.photoURL
    };

    return firebase.firestore().collection("users").doc(firebaseUser.uid).set(user);
});

1
Dennis Alund 20 mars 2019 à 10:12