如何在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
相关产品推荐
相关产品推荐

