You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase的onAuthStateChanged中获取Google用户的名和姓

解决Google用户资料名姓拆分问题(无需分割displayName)

Firebase Auth返回的Google用户对象默认只提供displayName字段,但可以通过解析用户ID令牌的Claims安全获取单独的名(given_name)和姓(family_name),无需手动分割或存储敏感凭证。

修改后的实现代码

const app = initializeApp(firebaseConfig)
const storage = getStorage()
const analytics = getAnalytics(app)
const auth = getAuth(app)

const checkUserIsAuth = async () => {
  setIsCheckingAuth(true)

  const unsubscribe = auth.onAuthStateChanged(async (user) => {
    if (user) {
      try {
        // 获取ID令牌结果,包含Google提供的标准Claims
        const idTokenResult = await user.getIdTokenResult()
        const { given_name, family_name } = idTokenResult.claims
        
        // 构造包含名姓的用户对象
        const userWithFullNames = {
          ...user,
          firstName: given_name,
          lastName: family_name
        }
        setloggedUser(userWithFullNames)
      } catch (error) {
        console.error('获取用户身份信息失败:', error)
        // 失败时回退到原始用户对象
        setloggedUser(user)
      } finally {
        setIsCheckingAuth(false)
      }
    } else {
      setloggedUser(null)
      setIsCheckingAuth(false)
    }
  })

  // 返回订阅清理函数,避免内存泄漏
  return unsubscribe
}

useEffect(() => {
  const unsubscribe = checkUserIsAuth()
  return () => unsubscribe()
}, [])

核心逻辑说明

  • user.getIdTokenResult()是异步方法,会从Firebase服务器获取经过验证的ID令牌,其中包含Google OAuth提供的given_name(名)和family_name(姓)字段
  • 无需存储任何敏感凭证,每次页面刷新时通过Auth状态监听自动触发获取,流程完全安全
  • 加入错误处理,确保网络异常等情况不阻断Auth检查流程
  • useEffect中返回unsubscribe函数,清理Auth状态监听,避免组件卸载后内存泄漏

注意事项

  • 该方法仅适用于Google登录的用户,其他登录方式(如邮箱/密码)不会提供这些Claims字段
  • 这些Claims由Google签名,Firebase会自动验证其有效性,不存在篡改风险

内容的提问来源于stack exchange,提问作者Fer Alvarez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:54:58