使用 firebase(React/Javascript)创建唯一用户名 [重复]

Posted

技术标签:

【中文标题】使用 firebase(React/Javascript)创建唯一用户名 [重复]【英文标题】:Creating Unique Usernames with firebase (React/Javascript) [duplicate] 【发布时间】:2019-12-23 21:19:56 【问题描述】:

我正在尝试做的是使用 Firebase 身份验证创建新用户,并在 Firestore 中创建自己的文档条目。到目前为止一切都很顺利,直到我想创建唯一的用户名。这样做的最佳方法是什么?我应该创建一个所有用户的数组以在每次注册时进行交叉引用,或者创建一个专用于用户名的集合,并附上他们的电子邮件(你可以看到我在第二次调用 Firebase 时做了)

Firebase 身份验证仅接收电子邮件和密码,因此这是不可能的,或者至少从我收集的信息来看。

export const signInUser = async ( name, email, password ) => 
  try 
    await firebase
      .auth()
      .createUserWithEmailAndPassword(email, password)
      .then(cred => 
        return firebase
          .firestore()
          .collection("users")
          .doc(cred.user.uid)
          .set(
            name: name,
            email: email,
            friends: []
          );
      );
    await firebase
      .firestore()
      .collection("usernames")
      .doc(name)
      .set( username: name, email: email );
    firebase.auth().currentUser.updateProfile(
      displayName: name
    );

    return ;
   catch (error) 
    switch (error.code) 
      case "auth/email-already-in-use":
        return 
          error: "E-mail already in use."
        ;
      case "auth/invalid-email":
        return 
          error: "Invalid e-mail address format."
        ;
      case "auth/weak-password":
        return 
          error: "Password is too weak."
        ;
      case "auth/too-many-requests":
        return 
          error: "Too many request. Try again in a minute."
        ;
      default:
        return 
          error: "Check your internet connection."
        ;
    
  
;

【问题讨论】:

“我想创建唯一的用户名。这样做的最佳方式是什么?”你已经尝试了什么?你遇到了什么问题? 还可以查看关于该主题的许多问题,例如***.com/q/47405774、***.com/q/51363730,可能更多来自这里:google.com/search?q=firestore+unique+username @FrankvanPuffelen 我正要使用 snapshot.empty 方法来实现我的结果,但由于你提到它可能被恶意用户滥用,正如你之前所说的,我也没有选择。谢谢,我将使用 Peter O 链接的反向映射方法。 【参考方案1】:

我会在这里跳过“用户名”集合,因为您基本上是在创建一个索引,fireStore 已经为您做了。要检查名称是否唯一,您可以执行以下操作:

const snapshot = await firestore.collection("users").where("name", "==", name).get();
// The name is taken if snapshot.empty is false.

【讨论】:

为确保只有一个用户可以声明姓名,您需要进行交易。即使这样,恶意用户也可以绕过该代码并为所欲为,因为您无法使用安全规则来防止重复的。这就是为什么其他答案使用名称作为 key 来识别文档的原因。由于密钥在定义上是唯一的,这会自动防止重复的用户名,并且可以使用安全规则进行保护。

以上是关于使用 firebase(React/Javascript)创建唯一用户名 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

React:使用 firebase-ui 设置 firebase 身份验证

如何在 firebase-functions 中使用 firebase.auth()?

在 Swift Playground 中导入使用 Firebase 的框架(“缺少必需的模块 'Firebase'”)

在一个移动应用中使用来自不同 Firebase 项目的两个 Firebase 服务

使用 Firebase 函数获取上传到 Firebase 存储的 pdf 的签名下载 URL

Firebase:使用预留托管 URL 时未创建 Firebase 应用“[DEFAULT]”