FIREBASE CRUD mettre à jour l'Email

FIREBASE CRUD mettre à jour l'Email

Etape 12

Pour changer l'adresse Email de l'utilisateur, nous utilisons dans un premier temps la méthode Firebase "updateEmail()" qui prend en paramètre l'adresse mail, puis la méthode "sendEmailVerification()" juste après.

Première Méthode :

D'après la documentation de Firebase, ce changement peut avoir lieu si la connexion est récente,

Capture d’écran 2021-03-04 à 18.07.49.png

Nous allons donc ré-authentifier l'utilisateur avec ".reauthenticate" de Firebase avant de changer son Email. Dans "FireAuth.swift, ajouter la méthode "updateUserEmail" avec en paramètres l'email de remplacement et le mot de passe :

func updateUserEmail(newEmail: String, password: String) {
            //obtenir le credential (identifiants)
        guard let currentEmail = myEmail() else { return }
        let credential = EmailAuthProvider.credential(withEmail: currentEmail, password: password)

            // ré-authentifier l'utilisateur, pour avoir une auth récente nécessaire au changement email/password
        Auth.auth().currentUser?.reauthenticate(with: credential, completion: { (result, error) in
            if error != nil {
                self.printToConsole(message: "ERREUR:  \(String(describing: error?.localizedDescription)) pour la mise à jour")
                return
            }
                //mise à jour de l'email
            Auth.auth().currentUser?.updateEmail(to: newEmail, completion: nil)
        })
    }

func printToConsole(message : String) {
           #if DEBUG
               print(message)
           #endif
       }

Les erreurs peuvent être gérées dans la complétion :

...
Auth.auth().currentUser?.updateEmail(to: newEmail, completion: { (error) in
                if error != nil {
                    self.printToConsole(message: "ERREUR:  \(String(describing: error?.localizedDescription)) pour la mise à jour")
                } else {
                    self.printToConsole(message: "email mis à jour")
                }
            })
...

L'adresse Email est récupérée avec la méthode "myEmail()". Pour le mot de passe, une popup s'ouvrira pour que l'utilisateur le saisisse pour la ré-authentification. Dans "ProfilController.swift", ajouter une méthode "updateEmail()" dans laquelle nous créons une alerte :

func updateEmail() {
        // on ajoute une alerte pour demander le mot de passe nécessaire à le reconnexion
        let alert = UIAlertController(title: "Mot de Passe?", message: "Pour changer votre adresse Email, vous devez vous reconnecter, merci de saissir votre mot de passe", preferredStyle: .alert)

        alert.addTextField(configurationHandler: { textField in
            textField.placeholder = "Saisir votre mot de passe"
            textField.isSecureTextEntry = true
        })
        alert.addAction(UIAlertAction(title: "Annuler", style: .cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "OK", style: .destructive, handler: { [self] action in

           //ici la méthode update()

                self.showAlert("Mise a jour", "votre adresse Email est modifiée avec succès")
            }
            }))

        self.present(alert, animated: true)
        }

Avant de changer l'adresse Email, nous allons nous assurer que la nouvelle adresse est bien au format "email", en ajoutant une extension "String " :

extension String {
    var isValidEmail: Bool {
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: self)
    }
}

Si la nouvelle adresse est au bon format, nous récupérons le mot de passe du champ de texte de l'alerte, et appelons la méthode "updateUserEmail()" dans la méthode "updateEmail()"

...
alert.addAction(UIAlertAction(title: "OK", style: .destructive, handler: { [self] action in

            //si l'email est au format email, on récupére le password et update
            if ((self.adresseMailTF.text?.isValidEmail) != nil), let password = alert.textFields?.first?.text {

                FireAuth().updateUserEmail(newEmail: self.adresseMailTF.text!, password: password)
                self.showAlert("Mise a jour", "votre adresse Email est modifiée avec succès")
            }
            }))

        self.present(alert, animated: true)
...

Capture d’écran 2021-03-04 à 19.01.39.png

Seconde Méthode :

Il est possible de demander confirmation du changement avec un email envoyé à la nouvelle adresse. Cette nouvelle adresse ne sera prise en compte que lorsque l'email sera confirmé.

Cet email est envoyé par Firebase. Vous pouvez retrouver son modèle dans les "Templates" de l'Authentification de la console du projet. Tout en bas, vous pouvez choisir la langue du modèle.

Dans la méthode "updateUserMail()" de "FireAuth.swift", il suffit de remplacer la méthode "updateEmail()" par la méthode "sendEmailVerification()"

...
Auth.auth().currentUser?.sendEmailVerification(beforeUpdatingEmail: newEmail, completion: nil)
...