当我使用 googleSignIn 时,用户在 Firestore 上重复

阿农

我有两种方法可以在 Firebase 中注册用户:通过电子邮件和通过 Google 登录。

我通过电子邮件执行用户注册如下:

signUp() {
  const auth = getAuth();
  const db = getFirestore();
  createUserWithEmailAndPassword(
    auth,
    this.createEmail,
    this.createPassword
  ).then(
    (userCredential) => {
      const user = userCredential.user;
      this.$router.push("/");
      addDoc(collection(db, "users"), {
        email: this.createEmail,
        name: this.createName,
      });
    },
  );
},

换句话说,除了在 Firebase 身份验证中保存用户之外,我还将他们的姓名和电子邮件发送到 Firestore。这是我的第一个问题:

  • 这是保存用户名和将来仍将添加到其中的数据的最有效方法吗?

最后,通过谷歌登录完成如下:

googleSignIn() {
  const auth = getAuth();
  const provider = new GoogleAuthProvider();
  signInWithPopup(auth, provider)
    .then((result) => {
      this.$router.push("/");
      addDoc(collection(db, "users"), {
        email: result.user.email,
        name: result.user.displayName,
      });
    })
},

这里出现了一个问题,因为如果用户在 Firebase 身份验证中多次登录,一切正常,但在 Firebase Firestore 中,每次使用 Google 新登录都会创建一个用户。

  • 我如何处理在 Firestore 中存储用户的问题,尤其是来自 Google 登录的用户?
达马拉吉

首先,我将移动router.push()下面语句,addDoc()以便我可以确认文档已添加,然后用户被重定向到其他页面。在使用 Google SignIn 的情况下,您可以isNewUser通过获取附加信息访问该属性来检查用户是否是新用户如果为 true,则将文档添加到 Firestore,否则重定向到仪表板:

signInWithPopup(auth, provider)
  .then(async (result) => {
  
  // Check if user is new
  const {isNewUser} = getAdditionalUserInfo(result)

  if (isNewUser) {
    await addDoc(collection(db, "users"), {
      email: result.user.email,
      name: result.user.displayName,
    });
  }
  this.$router.push("/");
})

将文档 ID 设置为用户的 Firebase 身份验证 UID 而不是使用addDoc()哪个生成另一个随机 ID可能是个好主意,这样更容易编写安全规则。尝试将代码重构为:

signInWithPopup(auth, provider)
  .then(async (result) => {
  
  // Check if user is new
  const {isNewUser} = getAdditionalUserInfo(result)
  const userId = result.user.uid

  if (isNewUser) {
    await setDoc(doc(db, "users", userId), {
      email: result.user.email,
      name: result.user.displayName,
    });
  }
  this.$router.push("/");
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GoogleMobileVision GoogleSignIn使用Cocoapods的重复符号?

当我使用 where 时 Firestore 不会检索我的数据

当我在MongoDB上使用$ push更新数组时避免重复的值

当我使用 Flutter Firestore 进行身份验证流程(登录、注销)时,如何为特定用户获取正确的数据?

当我使用Nginx时如何在Odoo上获取用户IP地址

当我使用array.push时,for的for重复值的Javascript

当我使用自己的TableInputFormat时,TableMapper上的ClassNotFoundException

Alamofire失败:当我在url上使用json时,invalidURL

使用 Carthage 集成 Firebase GoogleSignIn

当我添加新的HTML元素时,在<body>上重复了CSS渐变背景

当我在 bootstrap tagsinput 上 console.log 时发出重复值

Firebase GoogleSignIn.signIn() 阻止用户交互

添加Firestore时重复的类

当我运行代码、获取结果并重复时,之前的用户输入显示在新用户输入之前。任何的想法?

使用Firebase时,GoogleSignIn被标记为内部,不应从应用程序访问

更改GoogleSignIn窗格版本时使用未声明的类型'GIDSignInUIDelegate'

当我使用颤振进行开发时,我无法在 iOS 上显示谷歌地图

当我使用for循环时,JSRender / JSView重复所有模板

当我使用“active_admin/select2”时,ActiveAdmin“has_many”表单重复

点击GoogleSignIn按钮时应用崩溃

当我的输入甚至不等于警告时,为什么我会在主键上获得重复条目?

现在,当我们使用扩展语法时,何时使用“应用在通话”上?

防止 Firestore IOS 中的重复用户

当我尝试在它们上使用错误的 api 时,我可以让 Set/Map 打我吗?

为什么当我尝试使用工作表上的按钮启动用户表单而从主菜单启动用户表单时,我的复选框不起作用?

R-使用GoogleSignIn和ObserveEvent

无法使用Firebase进行googleSignIn-Android

当我在母版页上使用此脚本时出现此异常

当我们在向量上使用唯一函数时,移位如何工作?