Firebase iOS:如何检测用户是否已通过Google完成注册?
解决方案
核心问题在于fetchSignInMethods(forEmail:)无法区分Google账号是否已在Firebase Auth中注册——只要该邮箱可通过Google OAuth验证,无论账号是否存在,都会返回google.com。改用Firebase Auth提供的additionalUserInfo.isNewUser属性即可实现需求:
实现思路
当用户选择「Sign Up with Google」时:
- 完成Google OAuth流程获取凭证
- 调用
signIn(with:credential),Firebase会自动处理账号创建或登录 - 通过
authResult.additionalUserInfo?.isNewUser判断是否为新注册用户:- 若为
true:执行注册成功后的逻辑 - 若为
false:提示用户账号已存在,引导使用登录按钮,可选择退出当前登录
- 若为
修改后的代码
private func authWithGoogle(isLogin: Bool) { guard let clientID = FirebaseApp.app()?.options.clientID else { return } let config = GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.configuration = config GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { [weak self] signinResult, error in guard let self = self else { return } if let error = error { let nsError = error as NSError if nsError.code == -5 { return } self.handleAuthError(error) return } guard let user = signinResult?.user, let idToken = user.idToken?.tokenString else { self.error(NSError.genericErrorMessage) return } let accessToken = user.accessToken.tokenString let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken) if isLogin { self.loginUserWithCredential(credential, completion: nil) } else { Auth.auth().signIn(with: credential) { authResult, error in if let error = error { self.handleAuthError(error) return } guard let authResult = authResult else { self.error(NSError.genericErrorMessage) return } if authResult.additionalUserInfo?.isNewUser == true { self.finished(user: authResult.user, isLogin: false) } else { // 提示账号已存在,引导使用登录按钮 self.error(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "该Google账号已注册,请使用登录按钮"])) // 可选:退出当前登录,避免用户处于已登录状态 try? Auth.auth().signOut() } } } } }
补充说明
- 若用户此前用同一邮箱通过其他方式(如Apple)注册过,使用Google走注册流程时,
isNewUser会返回false,这符合需求——只要账号已存在,就引导用户登录 - 登录流程保持原有逻辑不变,无需修改
内容的提问来源于stack exchange,提问作者Joris
相关产品推荐
相关产品推荐

