我可以通过 Apple 登录来执行此操作,但似乎无法通过 Google 执行此操作:
我想确保如果用户选择“使用 Google 注册”,他们只能在我们这边的 Firebase Auth 中不存在 Google 帐户的情况下才能使用它。如果存在,则应该向他们显示他们的帐户已经存在,并要求他们使用“登录”按钮。
我看不出有什么办法。我尝试使用下面的方法fetchSignInMethods
,但它不仅被弃用,而且google.com
当有新用户注册时它还会返回。
private func authWithGoogle(isLogin: Bool) {
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.configuration = config
// Start the sign in flow!
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
)
guard let email = user.profile?.email else {
self.error(NSError.genericErrorMessage)
return
}
Auth.auth().fetchSignInMethods(forEmail: email) { (methods, error) in
print("\(methods!)")
if isLogin {
self.loginUserWithCredential(credential, completion: nil)
} else {
Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
self.handleAuthError(error)
return
}
self.finished(user: authResult!.user, isLogin: false)
}
}
}
}
}
以前,可以通过调用该方法在 Firebase 身份验证中实现此目的。遗憾的是,当 Firebase在 2023 年末
fetchProvidersForEmail
默认启用针对新项目的电子邮件枚举攻击的保护时,该方法已被弃用。从那时起,您可以明确禁用保护,或者(更好的)您必须自己跟踪用户的登录方法。它与 Firebase 用来公开的数据非常相似,因此请务必再次自行保护电子邮件枚举攻击。
有关 Firebase 在此 API 中公开的内容的示例,请参阅REST API 调用的此签名。