firebase auth:创建和更新用户配置文件的建议工作流程:检查用户是否是全新的?

4szc88ey  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(352)

我有一个博客应用程序,用户可以注册并发布文章和评论。我需要帮助为以下内容找到一个好的应用程序工作流程:
一个新用户注册并输入他的电子邮件地址、密码和他想使用的唯一用户名。应用程序会检查用户名的有效性,如果用户名不存在,则会创建一个新的用户文档和一个新的用户名文档:
用户配置文件文档:

用户名文档:

创建用户名和用户文档(批写)后,我注销用户并向其发送电子邮件验证电子邮件。在验证电子邮件之前,他无法登录该网站。一旦他核实了电子邮件,他就可以登录到该网站。我现在通过 onAuthStateChanged 诸如此类的观察员: ~/plugins/auth.js :

onAuthStateChanged(auth, (user) => {
    if (user) {
      store.dispatch('onAuthStateChangedAction', user)
    } else {
      store.dispatch('logOutUser')
    }
  })

在应用商店里,我有 onAuthStateChangedAction 像这样:

async onAuthStateChangedAction({ commit, dispatch }, authUser) {
    const { displayName, email, emailVerified, photoURL, providerData, uid } =
      authUser
    commit('SET_AUTH_USER', {
      displayName,
      email,
      emailVerified,
      photoURL,
      providerData,
      uid
    })
    await dispatch('getUserProfile', authUser)
  }

所以我得到了登录用户,但是当用户第一次登录时,设置用户配置文件的好方法是什么?一些用户是第一次登录,其他用户可能已经是现有用户,不需要重新创建他们的用户配置文件(如果没有必要,我试图阻止写入firestore)。
但是,如果他之前已经完全签约,就没有必要这么做。我只想抓住他的个人资料继续前进。
有什么东西我可以加进去吗 user 文档,以便我知道用户是全新的,尚未完全登录?
我的 getUserProfile 行动:

async getUserProfile({ commit, dispatch }, authUser) {

    // if user logging in to the first time, add new fields, but if already existing user, just grab his user profile 
updatedAt: serverTimestamp(),
emailVerified: authUser.emailVerified

  }

也许有更好的方法来处理这个用例,或者有更简单的方法?谢谢你的评论和建议!

0dxa2lsx

0dxa2lsx1#

用户可能已经是现有用户,不需要重新创建其用户配置文件
您可以检查他们的文档是否已经创建。如果没有,请添加文档,否则继续。

onAuthStateChanged(auth, (user) => {
  if (user) {
    if (!user.emailVerified) {
       // User has not verified the email yet
       // Force logout user
    }
    const {uid} = user
    const userDocRef = doc(db, "users", uid);
    const userDocSnap = await getDoc(userDocRef);
    if (docSnap.exists()) {
      // Profile document is already added
    } else {
      store.dispatch('onAuthStateChangedAction', user)
    }
  } else {
    store.dispatch('logOutUser')
  }
})

另一种方法是使用 isNewUser 财产自 additionalUserInfo . 但如果您使用的是电子邮件密码验证,则 createUserWithEmailAndPassword 方法将始终返回 isNewUser 作为 truesignInWithEmailAndPassword 永远都会回来 false 当用户在创建帐户时登录。因此,下次登录时,他们不再是新用户。
此外,您可以使用安全规则确保仅在文档丢失时创建文档。

match /users/{userID} {
    allow create: if request.auth != null && request.auth.uid == userID && resource == null;
    allow update: if request.auth != null && request.auth.uid == userID;
}

相关问题