如何在Firebase项目中向用户添加额外的信息

时间:2019-02-25 09:57:28

标签: node.js firebase firebase-realtime-database firebase-authentication

我在使用node.js上的firebase管理库在用户顶部存储额外信息时遇到困难。

例如,我想为每个用户存储一个ID,比如organizationId。

我尝试过的事情:

// Add user to firebase Auth Service
            admin.auth().createUser({
                email: email,
                emailVerified: false,
                password: 'secret',
                organization: 99,
                disabled: false
            })
                .then(function (userRecord) {
                    // See the UserRecord reference doc for the contents of userRecord.
                    console.log("Successfully created new user:", userRecord.uid);
                })
                .catch(function (error) {
                    console.log("Error creating new user:", error);
                });
        })

这是在毫无抱怨的情况下创建用户,但是当我尝试在用户登录时获取组织信息时,它显示为未定义。

我还试图将id存储在photoUrl中,这是不可能的。

有什么办法可以为用户添加额外的信息?还是我必须创建数据库并专门存储每个用户的组织ID的唯一方法?

谢谢

2 个答案:

答案 0 :(得分:1)

通过Admin SDK的createUser()方法创建时,无法向用户添加“额外信息”。 documentation解释说,您需要传递一个CreateRequest对象,该对象包含特定数量的字段。

如果您想添加额外的信息,您将需要在数据库中创建额外的文档(例如,在Firestore的users集合中)。

您可以在Cloud Function中使用以下代码(即使用Admin SDK):

  ...
  return admin
      .auth()
      .createUser({
        email: email,
        emailVerified: false,
        password: password,
        displayName: userName,
        disabled: false
      })
      .then(userRecord => {

        const userId = userRecord.uid;

        const userDocRef = admin
          .firestore()
          .collection('users')
          .doc(userId);

       return userDocRef.set(userDocRef, {
          userName: userName,
          firstName: firstName,
          lastName: lastName,
          organization: 99
        });
      })
      .then(....)

请注意,photoURLCreateRequest对象的一个​​可能字段。因此,您可以使用此字段或在用户文档中创建自己的特定字段。


根据您的评论进行更新:

我了解到您想将用户的多余文档保存在Firebase实时数据库中(而不是Firestore中),并且在为userUid设置正确值时遇到问题。您应该使用方括号表示法,如下所示:

var update = {};
update[userUid] = { organization: 999 };
return usersRef.set(update);

答案 1 :(得分:0)

这可以使用自定义声明来完成。我按照文档中的建议使用自定义声明将用户分配给访问组。

参考:https://firebase.google.com/docs/auth/admin/custom-claims

admin.auth().createUser({ email: email, emailVerified: false, password: 'secret', organization: 99, disabled: false })
  .then(function(userRecord) {
    let u = userRecord.toJSON();
    admin.auth().setCustomUserClaims(u.uid, { 'custominfo': false, 'morecustom': true }).catch(function(error) { console.log("Error:", error); });
  }).catch(function(error) { console.log("Error:", error); });

分配自定义声明后,声明将保留在 userRecord 中,并且可以检索。

firebase.auth().signInWithEmailAndPassword(email.trim(), password).then(user => { 
  firebase.auth().currentUser.getIdTokenResult().then(async idTokenResult => { 
    console.log("claims",idTokenResult.claims); }); });