【问题标题】:Manage User - Firebase and Angular管理用户 - Firebase 和 Angular
【发布时间】:2019-08-10 22:55:39
【问题描述】:

我正在尝试通过电子邮件获取用户,这似乎很简单。我正在关注这个documentation

我的代码似乎无法识别admin,这是正常的,因为我没有在任何地方定义。我所做的是将admin 更改为firebase,成为firebase:

import * as firebase from "firebase/app";

代码是:

firebase.auth.getUserByEmail(participantEmail)

但我收到以下错误:

类型'Auth'.ts(2339) 上不存在属性'getUserByEmail'

我需要预先安装一些东西吗?我错过了什么吗?

我的目标是获取在我的系统上注册的所有用户电子邮件的列表,然后过滤它们,或者通过查看电子邮件直接获取特定用户(第二个选项会更好)。

更新 现在我在每次有人登录时创建一个用户列表,但我认为 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) 时,我能够看到displayNameemailphotoURL。尽管如此,如果我尝试使用console.log(user.displayName) 打印null,如果我使用console.log(user.email) 打印它的值。

我认为这可能是因为user.updateProfile() 没有完成,但实际上,我在insertUser() 中得到user 的值没有任何问题

【问题讨论】:

  • 只是为了确保:您在 nodejs 服务器上使用 admin-SDK,而不是在前端 Angular 项目中,对吗?
  • 并非如此,我正试图让用户参与我的前端 Angular 项目。但我真的不知道该怎么做。我要做的是检查我的系统中是否注册了一封电子邮件

标签: angular typescript firebase firebase-authentication


【解决方案1】:

正如您所指出的:getUserByEmail 只是管理 SDK 的一部分,您将无法从您的 Angular 代码中调用它。

如果您的应用具有查找或管理其他用户的概念,那么您可能会认为这些用户是您的业务数据的一部分。因此,在创建身份验证帐户时复制并创建配置文件数据 (you can read more here)。

您可以找到有关 firebase 用户对象 in the documentation 上可用信息的更多信息。只需复制您需要的内容并将其存储在您可以从 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);
});

【讨论】:

    【解决方案2】:

    只有 Firebase Admin SDK 可以通过 Firebase 身份验证获取用户。 Admin SDK 只能在安全的环境中使用,即后端服务器。

    您可以做的是使用 Firebase 云函数 Auth creation trigger,然后将电子邮件地址写入您的 Firebase 数据库/Firestore。 然后你可以在 Angular 应用中query your database 根据电子邮件地址过滤掉用户。

    另一种选择是拥有一个 HTTPS 函数,您可以将电子邮件地址发送到该函数,然后该函数可以使用 admin sdk 从 Firebase 身份验证中提取用户。

    【讨论】:

      【解决方案3】:

      通过做

      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 没有直接的方法“获取在 [您的] 系统上注册的所有用户电子邮件的列表”。

      “通常”的做法是在您的数据库(RealTime Database 或 Firestore)中维护一个用户列表,并根据需要查询数据库。

      【讨论】:

      • 好的。这是我的想法,但我试图避免开始创建此列表。感谢您的确认
      • 我已经更新了这个问题。你能看一下吗?
      • 没什么,已经解决了。我只需要在更新配置文件后使用然后从那里调用它
      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多