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

如何在SignInWithCredentialAsync时检测FirebaseUser是否已存在

Unity Firebase Google登录区分新用户/老用户方案

问题核心

使用Firebase Authentication结合GoogleSignIn实现登录时,后端API需要明确当前用户是首次创建还是已存在的老用户。尤其在用户卸载重装应用后,本地user变量为空,重新执行SignInWithCredentialAsync流程时,无法直接判断用户在Firebase服务器上的状态。

解决方案

Firebase的AuthResult对象包含AdditionalUserInfo.IsNewUser属性,可直接判断该用户是否是首次通过当前凭证登录Firebase。利用这个属性就能精准区分新用户注册和老用户登录场景。

修改后的代码

public void OnSignIn()
{
    if (fireBaseReady == true)
    {
        if (user != null)
        {
            LoggedInAlready("login", user);
        }
        else
        {
            loginButton.SetActive(false);
            GoogleSignIn.Configuration = configuration;
            GoogleSignIn.Configuration.UseGameSignIn = false;
            GoogleSignIn.Configuration.RequestIdToken = true;
            GoogleSignIn.Configuration.RequestEmail = true;
            GoogleSignIn.DefaultInstance.SignIn().ContinueWithOnMainThread(OnAuthenticationFinished);
        }
    }
}

internal void OnAuthenticationFinished(System.Threading.Tasks.Task<GoogleSignInUser> task)
{
    if (task.IsCanceled)
    {
        warning.text = "SignIn got canceled";
        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
    }
    else if (task.IsFaulted)
    {
        warning.text = "SignIn was Faulted";
        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
    }
    else
    { 
        userToken = task.Result.IdToken;
        Credential credential = Firebase.Auth.GoogleAuthProvider.GetCredential(userToken, null);
        auth.SignInWithCredentialAsync(credential).ContinueWithOnMainThread(authTask =>
        {
            if (authTask.IsCanceled)
            {
                warning.text = "Authentification is canceled";
                anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
            }
            else if (authTask.IsFaulted)
            {
                warning.text = "Authentification is faulted";
                anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
            }
            else
            {
                var authResult = authTask.Result;
                user = authResult.User;
                // 通过AdditionalUserInfo判断是否为新用户
                string actionType = authResult.AdditionalUserInfo.IsNewUser ? "register" : "login";
                LoggedInAlready(actionType, user);
            }
        });
    }
}

关键说明

  • authResult.AdditionalUserInfo.IsNewUser:该属性由Firebase服务器返回,不受本地应用卸载重装影响。只要用户在Firebase服务器上已存在(即使本地无缓存),该值会返回false;首次登录则返回true。
  • 此方案无需额外维护本地存储或后端数据库状态,直接利用Firebase Auth的原生能力即可完成判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:44