Posso fazer isso com o Login com a Apple, mas não consigo fazer isso com o Google:
Quero ter certeza de que se um usuário selecionar "Inscreva-se com o Google", ele só poderá usá-lo se nenhuma conta do Google existir do nosso lado no Firebase Auth. Se existir, ele deve mostrar a eles que a conta já existe e pedir que usem o botão "Entrar".
Não vejo como fazer isso. Tentei o abaixo usando fetchSignInMethods
, mas não só está obsoleto, como também retorna google.com
quando um novo usuário se inscreve.
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)
}
}
}
}
}
Isso costumava ser possível no Firebase Authentication chamando o
fetchProvidersForEmail
método. Infelizmente, esse método foi descontinuado quando o Firebase passou a habilitar sua proteção contra ataques de enumeração de e-mail em novos projetos no final de 2023.Desde então, você pode desabilitar explicitamente a proteção ou (melhor) você mesmo terá que rastrear os métodos de login dos seus usuários. Seria bem parecido com os dados que o Firebase costumava expor, então certifique-se de se proteger novamente contra ataques de enumeração de e-mail.
Para um exemplo do que o Firebase expõe nesta API, veja esta assinatura da chamada da API REST .