Как запретить Firebase создавать одного и того же пользователя снова и снова? - PullRequest
0 голосов
/ 11 февраля 2019

В настоящее время я занимаюсь разработкой приложения для событий в платформе Ionic 4 (с Firebase в качестве фонового) и столкнулся с проблемой при создании пользователей в базе данных Cloud Firestore.Каждый раз, когда я использую логин Google или Facebook, Firebase создает новую запись в базе данных, хотя я вхожу с тем же пользователем.Я попытался осуществить проверку, если текущий user_id уже существует в базе данных, но что-то не так с моим кодом.Как я могу это исправить, чтобы мой код правильно проверял, существует ли текущий пользователь в базе данных?

В настоящее время у меня есть проверка, если пользователь уже существует в базе данных Cloud Firestore в моем компоненте входа в систему.Я уже пытался встроить проверку непосредственно в функцию createUser () в моем сервисе пользователя.Но поведение было точно таким же.

этот следующий код показывает функцию в моем компоненте входа в систему:

googleLogin() {
    if (this.authService.googleLogin()) {
    this.authService.getAuthState().subscribe(user => {
        if (user) {
          // User is signed in.
          console.log("Logged In ", user.email);
          this.userId = user.uid;
          this.user.name = user.displayName;

          this.afs.firestore.doc('user/' + user.uid).get()
          .then(docSnapshot => {
            if (docSnapshot.exists) {
              console.log("user already exists");
            } else {
              this.userservice.createUser(this.user);
            }
          });
        } else {
          console.log("Not Logged In");
          this.userId = undefined;
        }
      }
    );

этот следующий код показывает функцию в моей службе пользователя:

createUser(user: any): Promise<any> {
      return this.afs.collection("user").add({
        blockPushMessages: user.blockPushMessages,
        email: user.email,
        isAnonymous: user.isAnonymous,
        name: user.name,
        partyLevel: user.partyLevel,
        aliasName: user.aliasName,
        dateOfBirth: user.dateOfBirth,
        gender: user.gender,
        homeTown: user.homeTown,
        personImage_id: user.personImage_id,
        registrationDate: user.registrationDate,
        relationshipStatus: user.relationshipStatus,
        school: user.school
      });
  }

этот следующий код показывает функции входа в Google в моей службе аутентификации:

googleLogin() {
    if (this.platform.is("cordova")) {
      this.nativeGoogleLogin();
    } else {
      this.webGoogleLogin();
    }
    return true;
  }

async nativeGoogleLogin(): Promise<firebase.User> {
    try {
      const gplusUser = await this.gplus.login({
        webClientId:
          "**********",
        offline: true,
        scopes: "profile email"
       });
       return await this.afAuth.auth.signInWithCredential(
        firebase.auth.GoogleAuthProvider.credential(gplusUser.idToken)
      );
    } catch (err) {
      console.log(err);
    }
  }

 async webGoogleLogin(): Promise<void> {
    try {
      const provider = new firebase.auth.GoogleAuthProvider();
      const credential = await this.afAuth.auth.signInWithPopup(provider);
    } catch (err) {
      console.log(err);
    }
  }

Я ожидаю, что код проверит, существует ли текущий пользователь в моей базе данных Cloud Firestore.Фактический результат на данный момент состоит в том, что код игнорирует проверку и просто создает нового пользователя в базе данных, даже если я вхожу с тем же пользователем.

Если кто-то знает, что не так с моим кодом, пожалуйста,дай мне знать.Буду признателен за это!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я фактически сравнивал uid со случайно сгенерированным идентификатором документа в моей базе данных.Теперь я исправил код, присвоив моему пользовательскому объекту internal_id и создав пользовательский документ в базе данных с помощью uid вместо случайно сгенерированного идентификатора документа.И это рабочее решение:

Код из моего пользовательского сервиса:

createUser(user: any): Promise<any> {
      return this.afs.collection("user").doc(user.internal_id).set({
        internal_id: user.internal_id,
        blockPushMessages: user.blockPushMessages,
        email: user.email,
        isAnonymous: user.isAnonymous,
        name: user.name,
        partyLevel: user.partyLevel,
        aliasName: user.aliasName,
        dateOfBirth: user.dateOfBirth,
        gender: user.gender,
        homeTown: user.homeTown,
        personImage_id: user.personImage_id,
        registrationDate: user.registrationDate,
        relationshipStatus: user.relationshipStatus,
        school: user.school
      });
  }

Код из моего компонента входа в систему:

googleLogin() {
    if (this.authService.googleLogin()) {
    this.authService.getAuthState().subscribe(user => {
        if (user) {
          // User is signed in.
          console.log("Logged In ", user.email);
          this.user.internal_id = user.uid;
          this.internal_id = user.uid;
          this.user.name = user.displayName;

          this.afs.firestore.doc('user/' + this.internal_id).get()
          .then(docSnapshot => {
            if (docSnapshot.exists) {
              console.log("user already exists");
            } else {
              this.userservice.createUser(this.user);
            }
          });
        } else {
          console.log("Not Logged In");
          this.userId = undefined;
        }
      }
    );
0 голосов
/ 12 февраля 2019

Похоже, вы сравниваете uid, вы уверены, что uid является идентификатором пользователя в вашем бэкэнде?

...