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

Unity C#:如何区分Firebase Google Auth的新用户注册与老用户登录?

区分Firebase Google Auth新注册用户与老用户的解决方案

解决这个问题的核心是利用Firebase Auth提供的AdditionalUserInfo.IsNewUser属性——这个属性会明确标记当前用户是否是首次通过该凭证登录(也就是新注册用户)。你只需要在Firebase登录成功后,获取这个属性的值,就能区分新老用户,进而执行不同的逻辑(比如新用户初始化数据到Firestore,老用户加载已有数据)。

修改你的SignInWithGoogleOnFirebase方法

把原来的方法替换成下面的代码,新增对IsNewUser的判断:

private void SignInWithGoogleOnFirebase(string idToken)
{
    Credential credential = GoogleAuthProvider.GetCredential(idToken, null);

    auth.SignInWithCredentialAsync(credential).ContinueWith(task =>
    {
        // 处理登录异常
        if (task.IsFaulted)
        {
            AggregateException ex = task.Exception;
            if (ex != null && ex.InnerExceptions[0] is FirebaseException inner && inner.ErrorCode != 0)
            {
                AddToInformation("\nError code = " + inner.ErrorCode + " Message = " + inner.Message);
            }
            return;
        }

        AuthResult authResult = task.Result;
        AdditionalUserInfo userInfo = authResult.AdditionalUserInfo;
        FirebaseUser currentUser = authResult.User;

        if (userInfo.IsNewUser)
        {
            AddToInformation("新用户注册成功,初始化用户数据到Firestore...");
            // 调用保存新用户数据的方法
            SaveNewUserDataToFirestore(currentUser);
        }
        else
        {
            AddToInformation("老用户登录成功,加载已有数据...");
            // 调用加载用户已有数据的方法
            LoadExistingUserDataFromFirestore(currentUser);
        }
    });
}

新增保存新用户数据到Firestore的示例方法

这个方法会将新用户的基础信息(比如昵称、邮箱)存入Firestore,并用用户的UID作为文档ID,确保数据唯一:

private void SaveNewUserDataToFirestore(FirebaseUser user)
{
    // 构建需要保存的用户数据
    var userData = new Dictionary<string, object>
    {
        { "displayName", user.DisplayName },
        { "email", user.Email },
        { "createTime", FieldValue.ServerTimestamp() },
        // 可以添加更多你需要的自定义字段,比如头像URL、用户偏好等
    };

    // 保存到Firestore的"users"集合,文档ID用用户UID
    FirebaseFirestore.DefaultInstance.Collection("users").Document(user.Uid).SetAsync(userData)
        .ContinueWith(saveTask =>
        {
            if (saveTask.IsCompletedSuccessfully)
            {
                AddToInformation("用户数据初始化完成");
            }
            else
            {
                AddToInformation("保存用户数据失败: " + saveTask.Exception?.InnerException.Message);
            }
        });
}

关键说明

  • AdditionalUserInfo.IsNewUser是Firebase Auth官方提供的判断新用户的可靠方式,它会在用户首次登录时自动设为true,后续所有登录都会是false,避免自己查询Firestore可能出现的竞态问题。
  • 用用户的Uid作为Firestore文档ID,既保证了每个用户数据的唯一性,也方便后续通过UID快速查询用户数据。
  • 如果需要处理老用户的数据加载,只需在LoadExistingUserDataFromFirestore方法中通过用户UID查询Firestore文档即可。

内容的提问来源于stack exchange,提问作者Just a curious idiot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:16:27