我在使用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的唯一方法?
谢谢
答案 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(....)
请注意,photoURL
是CreateRequest
对象的一个可能字段。因此,您可以使用此字段或在用户文档中创建自己的特定字段。
根据您的评论进行更新:
我了解到您想将用户的多余文档保存在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); }); });