如何在不关闭当前 Firebase 会话的情况下创建用户身份验证 [重复]

Posted

技术标签:

【中文标题】如何在不关闭当前 Firebase 会话的情况下创建用户身份验证 [重复]【英文标题】:How to create user auth without closing the current firebase session [duplicate] 【发布时间】:2021-08-03 14:31:27 【问题描述】:

我想创建一个系统,管理员可以通过电子邮件创建用户身份验证。我已经按照文档说明进行了开发,但当前会话已关闭。我只想创建 auth 以获取 uid,然后在数据库中使用我要存储的数据创建一个用户。

这就是我所拥有的:

var email = emailInput.value;
var password = "Abcd1234";
firebase.auth().createUserWithEmailAndPassword(email, password).then((userCredential) => 
    var user = userCredential.user;
    //user.uid contains the id I want to create the instance on ref usuarios
    database.ref("usuarios/"+ user.uid).set(...);
);

编辑:

【问题讨论】:

【参考方案1】:

您无法使用客户端 SDK 创建新用户。我的意思是用户根据需要创建新用户。您需要使用 Firebase Admin SDK(必须在安全的服务器环境中 - 例如 Firebase Cloud Functions)。

你可以这样写一个云函数:

exports.createNewUser = functions.https.onCall((data, context) => 
  if (isAdmin(context.auth.uid)) 
    return admin.auth().createUser(
      email: data.email,
      password: data.password,
      displayName: data.name
    ).then((userRecord) => 
      // See the UserRecord reference doc for the contents of userRecord.
      console.log('Successfully created new user:', userRecord.uid);
      return  uid: userRecord.uid 
    ).catch((error) => 
      console.log('Error creating new user:', error);
      return  error: "Something went wrong" 
    );
  
  return error: "unauthorized" 
)

现在有多种方法可以验证调用此函数的用户是否为管理员。第一个将使用Firebase Custom Claims,这有点像您分配给用户的角色。另一种选择是将使用的 UID 存储在数据库中并检查 UID 是否存在于 db 的管理节点中。只需确保只有您可以编辑数据库的该部分。

从客户端调用函数:

const createNewUser = firebase.functions().httpsCallable('createNewUser');
createNewUser( name: "test", email: "test@test.test", password: "122345678" )
  .then((result) => 
    // Read result of the Cloud Function.
    var response = result.data;
  );

【讨论】:

我如何从 javascript 文件中调用这个函数? @EmiliBellotPulido 我已经更新了答案。您可以this了解更多详情。 不错,而且result.data会包含uid? @EmiliBellotPulido 它将包含您从函数返回的任何内容。你可以这样做return uid: userRecord.uid 来返回 UID :D 代码有效->用户是在firebase身份验证中创建的,但结果为null

以上是关于如何在不关闭当前 Firebase 会话的情况下创建用户身份验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不满足给定条件的情况下创建一系列变量并将它们存储在列表中?

在不关闭 MacOS 的情况下重启终端

如何在不实际创建数据库的情况下将在线可用数据库 API 中的数据提取到 firebase 数据库中? [关闭]

如何在不注销的情况下清除所有会话变量

如何在不关闭当前模式的情况下打开新模式

如何在不点击通知的情况下从通知中获取数据(firebase 云消息传递和本机反应)