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

