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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:42