Firebase 和 VueJS:如何处理使用 Google 登录但未在我的应用中注册的用户?用户资料管理

Posted

技术标签:

【中文标题】Firebase 和 VueJS:如何处理使用 Google 登录但未在我的应用中注册的用户?用户资料管理【英文标题】:Firebase and VueJS: How to handle users that login with Google and don't register in my app? User profile management 【发布时间】:2020-11-29 04:21:33 【问题描述】:

我有一个带有登录页面和注册页面的应用程序。两个页面都有一个“使用 Google 登录”按钮,以及为不想使用 Google 登录的用户提供的常规登录名和密码输入表单。我还使用 FireStore 为注册用户创建用户配置文件。当用户也登录时,应用程序将查询用户的个人资料以在整个应用程序中使用。这一切都很好。

我注意到谷歌用户不需要“注册”......他仍然可以点击登录按钮,它会自动“注册”,因为这就是 Google Auth Provider 的工作方式。然而,由于他没有“注册”,他还没有个人资料。在这种情况下,我必须编写一些逻辑,以便为 Google 用户创建个人资料。虽然这个逻辑有效,但我只是想知道这是否是最好的方法。是否有针对跳过传统“注册”页面的人处理 Google/Social 登录的最佳做法?我知道大多数人可能会前往注册页面并进行注册,但毫无疑问会有一些人会跳过该页面并进入 LOGIN 页面并以这种方式通过 Google 登录。

以下是我使用 Google 登录按钮处理登录页面的方式:

login.vue

async logInWithGoogle() 
      try 
        const provider = new this.$fireAuthObj.GoogleAuthProvider()
        const userCredentials = await this.$fireAuth.signInWithRedirect(
          provider
        ) ....

然后在我的 Store(在我的例子中,Vuex 状态管理模式)中,我有以下操作:

store.js

首先,这个 onAuthStateChanged 观察者会注意到新的用户状态并执行以下代码:

  async onAuthStateChangedAction( commit, dispatch ,  authUser ) 
    if (authUser) 
      console.log('user committing from onAuthStateChangedAction...')
      commit('SET_CURRENT_USER', authUser)

      console.log(
        'fetchUserProfile action dispatching from onAuthStateChangedAction...'
      )
      await dispatch('fetchUserProfile', authUser)
     else 
      dispatch('logOutUser')
    
  

onAuthStateChanged 观察者将获取用户的个人资料(这是我关心的逻辑...不确定这是否是处理用户首次通过 Google 登录并绕过注册的理想方式:

 async fetchUserProfile( commit , user) 
    try 
      const docRef = this.$fireStore.collection('users').doc(user.uid)

      const profile = await docRef.get()
      if (profile.exists) 
        commit('SET_USER_PROFILE', await profile.data())
        console.log(
          'user profile EXISTS and set from fetchUserProfile action'
        )
       else 
        console.log('profile does not exist! Creating...')
        await docRef.set(
          displayName: user.displayName,
          email: user.email,
          uid: user.uid,
          photoUrl: user.photoURL,
          providerId: user.providerData[0].providerId,
          createdAt: this.$fireStoreObj.FieldValue.serverTimestamp()
        )
        const p = await docRef.get()
        commit('SET_USER_PROFILE', await p.data())
        console.log('user profile set')
      
     catch (error) 
      console.log('can not fetch profile', error)
    
  ,

感谢任何提示或保证我在处理此问题时走的是正确(或错误)的道路。谢谢!

【问题讨论】:

【参考方案1】:

为什么不用用户的 uid 创建一个空文档并提示他们“完成他们的个人资料”?在他们这样做之前,强制将他们无限期地重定向回个人资料页面。

【讨论】:

我个人认为这不是一个好的用户体验。我想让他们使用这个应用程序变得简单,我希望他们留下来。他们随时可以在准备好后编辑他们的个人资料。谢谢你的建议!

以上是关于Firebase 和 VueJS:如何处理使用 Google 登录但未在我的应用中注册的用户?用户资料管理的主要内容,如果未能解决你的问题,请参考以下文章

Firebase云功能:如何处理持续请求

Firebase Auth UI 如何处理重新身份验证?

如何处理 google firebase web app 的安全性?

如何处理 Firebase 中过期的用户 ID 令牌?

登录时如何处理状态(Ionic、Firebase、AngularJS)?

如何处理 Firebase Cloud Functions 中的错误 JSON?