Управление пользовательской базой данных и Angular

#angular #typescript #firebase #firebase-authentication

#angular #typescript #firebase #firebase-аутентификация

Вопрос:

Я пытаюсь связаться с пользователем по электронной почте, и это кажется довольно простым. Я следую этой документации

Кажется, что мой код не распознает admin , что это нормально, потому что я нигде не определил. Что я сделал, так это изменил admin на firebase , будучи firebase:

 import * as firebase from "firebase/app";
  

и код был бы:

 firebase.auth.getUserByEmail(participantEmail)
  

но я получаю следующую ошибку:

Свойство ‘getUserByEmail’ не существует для типа ‘Auth’.ts(2339)

Нужно ли мне что-то предварительно устанавливать раньше? Я что-то пропустил?

Моя цель — получить список электронной почты всех пользователей, зарегистрированных в моей системе, а затем отфильтровать их или напрямую перейти к конкретному пользователю, просмотрев электронное письмо (второй вариант был бы лучше).

ОБНОВЛЕНИЕ Теперь я создаю список пользователей каждый раз, когда кто-то входит в систему, но я думаю, что firebase каким-то образом ограничивает информацию.

Регистрация

   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);
        }
      );
    });
  }
  

Вставить список

   //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
    });
  }
  

здесь я получаю значение user во всех его полях, что означает, что при использовании console.log(user) я могу видеть displayName , email и photoURL . Тем не менее, если я попытаюсь использовать console.log(user.displayName) печатает null и если я использую console.log(user.email) печатает его значение.

Я подумал, что это может быть из-за того, что user.updateProfile() не завершилось, но на самом деле я получаю значение user in insertUser() без каких-либо проблем

Комментарии:

1. просто чтобы убедиться: вы используете admin-SDK на сервере nodejs, а не в интерфейсном проекте angular, верно?

2. Не совсем, я пытаюсь привлечь пользователей к моему интерфейсному проекту angular. Но я действительно не знаю, как это сделать. Что я хочу сделать, так это проверить, зарегистрировано ли одно электронное письмо в моей системе

Ответ №1:

Выполнив

 import * as firebase from "firebase/app";
  

в вашем клиентском приложении вы фактически импортируете JavaScript SDK, а не Admin SDK. Это правильный способ, если этот импорт выполняется во внешнем интерфейсе приложения, поскольку Admin SDK должен использоваться «из защищенной серверной среды».

Вот почему вы получаете ошибку Property 'getUserByEmail' does not exist on type 'Auth'.ts(2339) , потому что этот метод не является частью службы Firebase Auth .

Сказав это, вы должны знать, что с JavaScript SDK нет простого способа «получить список электронной почты всех пользователей, зарегистрированных в [вашей] системе».

«Обычный» способ сделать это — вести список пользователей в вашей базе данных (база данных реального времени или Firestore) и запрашивать базу данных по мере необходимости.

Комментарии:

1. ОК. Это то, о чем я думал, но я пытался избежать начала создания этого списка. Спасибо за подтверждение

2. Я обновил вопрос. Не могли бы вы взглянуть на секунду?

3. Ничего, это было решено. Мне просто нужно было использовать then после обновления профиля и вызвать его оттуда

Ответ №2:

Как вы указали: getUserByEmail это только часть admin SDK, и вы не сможете вызвать это из своего кода Angular.

Если в вашем приложении используется концепция поиска других пользователей или управления ими, то вы можете считать, что пользователи являются частью ваших бизнес-данных. Итак, скопируйте и создайте данные профиля при создании учетной записи авторизации (подробнее вы можете прочитать здесь).

Вы можете найти дополнительную информацию о том, какая информация доступна в пользовательском объекте firebase в документации. Просто скопируйте то, что вам нужно, и сохраните это в коллекции, которую вы можете запросить из своего приложения 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);
});

  

Ответ №3:

Только Firebase Admin SDK может получить пользователя с помощью аутентификации Firebase. Admin SDK следует использовать только в безопасной среде, т. е. на внутреннем сервере.

Что вы можете сделать, так это использовать триггер создания авторизации в Firebase cloud functions, а затем записать адрес электронной почты в свою базу данных Firebase / Firestore. Затем вы можете запросить свою базу данных в приложении angular, чтобы отфильтровать пользователей на основе адреса электронной почты.

Другой вариант — иметь функцию HTTPS, на которую вы можете отправить адрес электронной почты, а затем функция может использовать admin sdk для извлечения пользователя из аутентификации Firebase.