S'authentifier avec Firebase à l'aide d'un lien e-mail sur les plates-formes Apple

Vous pouvez utiliser Firebase Authentication pour connecter un utilisateur en lui envoyant un e-mail contenant un lien sur lequel il peut cliquer pour se connecter. Au cours du processus, l'adresse e-mail de l'utilisateur est également validée.

Se connecter par e-mail présente de nombreux avantages :

  • L'inscription et la connexion sont faciles à effectuer.
  • Risque réduit de réutilisation des mots de passe dans les applications, ce qui peut compromettre la sécurité des mots de passe, même bien sélectionnés.
  • Capacité à authentifier un utilisateur tout en vérifiant qu'il est le le propriétaire légitime d'une adresse e-mail.
  • Pour se connecter, un utilisateur n'a besoin que d'un compte de messagerie accessible. Aucune propriété sur Vous devez indiquer un numéro de téléphone ou un compte de réseau social.
  • L'utilisateur peut se connecter de façon sécurisée sans avoir à fournir (ou à se souvenir) d'un mot de passe, ce qui peut être fastidieux sur un appareil mobile.
  • Un utilisateur existant qui s'est connecté à l'aide d'un identifiant d'adresse e-mail (mot de passe) ou fédérée) peuvent être mis à niveau pour se connecter uniquement avec l'adresse e-mail. Par exemple, un utilisateur qui a oublié son mot de passe peut toujours se connecter sans avoir à le réinitialiser.

Avant de commencer

Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.

  1. Dans Xcode, à partir de votre projet d'application ouvert, accédez à File > Add Packages (Fichier > Ajouter des packages).
  2. Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Choisissez la bibliothèque Firebase Authentication.
  5. Ajoutez l'indicateur -ObjC à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible.
  6. Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.

Pour connecter les utilisateurs à l'aide d'un lien d'adresse e-mail, vous devez d'abord activer le fournisseur de messagerie et Méthode de connexion par lien par e-mail pour votre projet Firebase:

  1. Dans la console Firebase, ouvrez le Authentification.
  2. Dans l'onglet Mode de connexion, activez le fournisseur Adresse e-mail/Mot de passe. Remarque la connexion par e-mail/mot de passe doit être activée pour utiliser la connexion par lien par e-mail.
  3. Dans la même section, activez la méthode de connexion Lien envoyé par e-mail (connexion sans mot de passe).
  4. Cliquez sur Enregistrer.

Pour lancer le flux d'authentification, présentez à l'utilisateur une interface qui invite l'utilisateur à fournir son adresse e-mail, puis appelle sendSignInLink pour demander à Firebase envoyer le lien d'authentification à l'adresse e-mail de l'utilisateur.

  1. Créez l'objet ActionCodeSettings, qui fournit à Firebase des instructions sur la création du lien vers l'adresse e-mail. Attribuez aux champs suivants les valeurs correspondantes :

    • url : lien profond à intégrer et état supplémentaire à transmettre. Le domaine du lien doit être ajouté à la liste des domaines autorisés de la console Firebase. Pour y accéder, accédez à l'onglet "Mode de connexion" (Authentication -> Sign-in method).
    • iOSBundleID et androidPackageName : applications à utiliser lorsque le lien de connexion est ouvert sur un appareil Android ou Apple. Découvrez comment configurer Firebase Dynamic Links pour ouvrir les liens d'action d'e-mail via des applications mobiles.
    • handleCodeInApp : défini sur "true". L'opération de connexion doit toujours être effectuée dans l'application, contrairement aux autres actions par e-mail hors bande (réinitialisation du mot de passe et validation de l'adresse e-mail). En effet, à la fin du flux, l'utilisateur doit être connecté et son état d'authentification doit persister dans l'application.
    • dynamicLinkDomain: lorsque plusieurs domaines de liens dynamiques personnalisés sont définis d'un projet, spécifiez celui à utiliser lorsque le lien doit être ouvert via une application mobile spécifiée (par exemple, example.page.link) ; Dans le cas contraire, le premier domaine est automatiquement sélectionné.

    Swift

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Objective-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Pour en savoir plus sur ActionCodeSettings, consultez la section Transmettre l'état dans les actions par e-mail.

  2. Demandez à l'utilisateur de vous fournir son adresse e-mail.

  3. Envoyer le lien d'authentification à l'adresse e-mail de l'utilisateur et enregistrer cette adresse au cas où l'utilisateur se connecte par e-mail sur le même appareil.

    Swift

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Objective-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Problèmes de sécurité

Pour éviter qu'un lien de connexion soit utilisé pour se connecter en tant qu'utilisateur indésirable ou sur un appareil non souhaité, Firebase Auth exige que l'adresse e-mail de l'utilisateur soit fourni lors de la procédure de connexion. Pour que la connexion aboutisse, cet e-mail doit correspondre à l'adresse à laquelle le lien de connexion a été envoyé initialement.

Vous pouvez simplifier ce flux pour les utilisateurs qui ouvrent le lien de connexion sur le même appareil qu'ils ont utilisé pour le demander en stockant leur adresse e-mail localement lorsque vous envoyez l'e-mail de connexion. Utilisez ensuite cette adresse pour finaliser le parcours.

Une fois la connexion terminée, tout mécanisme de connexion précédent non validé sera supprimé de l'utilisateur et toutes les sessions existantes seront invalidées. Par exemple, si quelqu'un a déjà créé un compte non validé avec le même l'adresse e-mail et le mot de passe, le mot de passe de l'utilisateur est supprimé pour empêcher usurpateur d'identité qui a revendiqué la propriété et créé ce compte non validé à partir de en vous connectant à nouveau avec le même compte.

Se connecter dans une application mobile Apple

Firebase Authentication utilise Firebase Dynamic Links pour envoyer le lien de l'e-mail à appareil mobile. Pour que la connexion soit effectuée via une application mobile, l'application doit être configurée pour détecter le lien d'application entrant, analyser le lien profond sous-jacent, puis effectuer la connexion.

Firebase Auth utilise Firebase Dynamic Links lors de l'envoi d'une qui doit être ouvert dans une application mobile. Pour utiliser cette fonctionnalité, vous devez configurer Dynamic Links dans la console Firebase.

  1. Activez Firebase Dynamic Links :

    1. Dans la console Firebase, ouvrez la section Dynamic Links.
    2. Si vous n'avez pas encore accepté les conditions d'utilisation de Dynamic Links et créé un Dynamic Links domaine, faites-le maintenant.

      Si vous avez déjà créé un domaine Dynamic Links, notez-le. Un domaine Dynamic Links se présente généralement comme suit :

      example.page.link

      Vous aurez besoin de cette valeur lorsque vous configurerez votre application Apple ou Android pour intercepter le lien entrant.

  2. Configuration des applications Apple:

    1. Si vous prévoyez de gérer ces liens depuis votre application, L'ID du bundle doit être spécifié dans la console Firebase paramètres du projet. En outre, vous devez également spécifier l'ID de l'App Store et l'ID de l'équipe de développeurs Apple.
    2. Vous devrez également configurer le domaine de votre gestionnaire d'action par e-mail en tant que domaine associé dans les fonctionnalités de votre application. Par défaut, Le gestionnaire d'actions de messagerie est hébergé sur un domaine, comme dans l'exemple suivant:
      APP_ID.firebaseapp.com
    3. Si vous prévoyez de distribuer votre application sur iOS 8 et versions antérieures, vous devez définir votre ID de bundle comme schéma personnalisé pour les messages entrants URL.
    4. Pour en savoir plus à ce sujet, consultez Instructions pour recevoir des instructions Dynamic Links sur la plate-forme Apple

Une fois que vous avez reçu le lien comme décrit ci-dessus, vérifiez qu'il est destiné à l'authentification du lien d'e-mail, puis finalisez la connexion.

Swift

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Objective-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Pour savoir comment gérer la connexion avec un lien e-mail dans une application Android, consultez le guide Android.

Pour savoir comment gérer la connexion avec un lien e-mail dans une application Web, consultez le guide Web.

Vous pouvez également associer cette méthode d'authentification à un utilisateur existant. Par exemple, un utilisateur qui s'est précédemment authentifié auprès d'un autre fournisseur (par exemple, avec un numéro de téléphone) peut ajouter cette méthode de connexion à son compte existant.

La différence se situe dans la seconde moitié de l'opération :

Swift

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Vous pouvez également l'utiliser pour réauthentifier un utilisateur de lien par e-mail avant d'exécuter une opération sensible.

Swift

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

Toutefois, comme le flux peut se terminer sur un autre appareil où l'utilisateur d'origine n'était pas connecté, il est possible qu'il ne soit pas terminé. Dans ce cas, un message d'erreur peut s'afficher pour forcer l'utilisateur à ouvrir le lien sur le même appareil. Un peu état peut être transmis dans le lien pour fournir des informations sur le type d'opération et l'UID utilisateur.

Si vous avez créé votre projet le 15 septembre 2023 ou après, la protection contre l'énumération des adresses e-mail est activée par défaut. Cette fonctionnalité renforce la sécurité de votre comptes utilisateur du projet, mais cela désactive fetchSignInMethodsForEmail() , que nous recommandions auparavant pour implémenter des flux axés sur les identifiants.

Bien que vous puissiez désactiver la protection contre l'énumération d'adresses e-mail pour votre projet, nous déconseille de le faire.

Consultez la documentation sur la protection contre l'énumération d'adresses e-mail. pour en savoir plus.

Étapes suivantes

Lorsqu'un utilisateur se connecte pour la première fois, un compte utilisateur est créé et associés aux identifiants, c'est-à-dire au nom d'utilisateur et au mot de passe, ou des informations sur le fournisseur d'authentification, c'est-à-dire l'utilisateur avec lequel l'utilisateur s'est connecté. Ce nouveau compte est stocké dans votre projet Firebase et peut être utilisé pour identifier un utilisateur dans toutes les applications de votre projet, quelle que soit la manière dont il se connecte.

  • Dans vos applications, vous pouvez obtenir les informations de base du profil de l'utilisateur à partir des User . Consultez Gérer les utilisateurs.

  • Dans votre Firebase Realtime Database et votre Cloud Storage Règles de sécurité, vous pouvez obtenez l'ID utilisateur unique de l'utilisateur connecté à partir de la variable auth et l'utiliser pour contrôler les données auxquelles un utilisateur peut accéder.

Vous pouvez autoriser les utilisateurs à se connecter à votre appli à l'aide de plusieurs authentifications fournisseurs en associant leurs identifiants compte utilisateur existant.

Pour déconnecter un utilisateur, appelez . signOut:.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Vous pouvez également ajouter un code de gestion des erreurs pour la plage complète des authentifications les erreurs. Consultez la section Gérer les erreurs.