管理用户-Firebase和Angular

时间:2019-03-20 09:32:03

标签: angular typescript firebase firebase-authentication

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

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

firebase

,代码为:

import * as firebase from "firebase/app";

但出现以下错误:

  

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

我需要预先安装一些东西吗?我想念什么吗?

我的目的是获取在我的系统上注册的所有用户电子邮件的列表,然后对其进行过滤,或者通过查看电子邮件直接访问特定的用户(第二种选择会更好)。

更新 现在,每次有人登录时,我都会创建一个用户列表,但是我认为firebase限制了信息的发布。

注册

firebase.auth.getUserByEmail(participantEmail)

插入列表

  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)displayNameemail。不过,如果我尝试使用photoURL会打印console.log(user.displayName),如果我使用null会打印其值。

我认为这可能是因为console.log(user.email)尚未完成,但实际上,我在user.updateProfile()中得到了user的值而没有问题

3 个答案:

答案 0 :(得分: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 :(得分:1)

就像您指出的那样:getUserByEmail只是admin 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 :(得分:0)

只有Firebase Admin SDK可以从Firebase身份验证获取用户。 Admin SDK仅应在安全环境(即后端服务器)中使用。

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

另一种选择是具有HTTPS功能,可以向其发送电子邮件地址,然后该功能可以使用admin sdk从Firebase身份验证中提取用户。