Vous pouvez utiliser l'authentification Firebase 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 vérifiée.
Il y a de nombreux avantages à se connecter par e-mail :
- Inscription et connexion à faible friction.
- 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.
- La possibilité d'authentifier un utilisateur tout en vérifiant que l'utilisateur est le propriétaire légitime d'une adresse e-mail.
- Un utilisateur n'a besoin que d'un compte de messagerie accessible pour se connecter. Aucune possession d'un numéro de téléphone ou d'un compte de réseau social n'est requise.
- Un utilisateur peut se connecter en toute sécurité sans avoir besoin de fournir (ou de mémoriser) un mot de passe, ce qui peut s'avérer fastidieux sur un appareil mobile.
- Un utilisateur existant qui s'est précédemment connecté avec un identifiant d'e-mail (mot de passe ou fédéré) peut être mis à niveau pour se connecter avec uniquement l'e-mail. Par exemple, un utilisateur qui a oublié son mot de passe peut toujours se connecter sans avoir besoin de réinitialiser son mot de passe.
Avant que tu commences
Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
- Dans Xcode, avec votre projet d'application ouvert, accédez à File > Add Packages .
- Lorsque vous y êtes invité, ajoutez le référentiel SDK des plates-formes Apple Firebase :
- Choisissez la bibliothèque d'authentification Firebase.
- Ajoutez l'indicateur
-ObjC
à la section Autres indicateurs de l'éditeur de liens des paramètres de construction de votre cible. - Une fois terminé, Xcode commencera automatiquement à résoudre et à télécharger vos dépendances en arrière-plan.
https://github.com/firebase/firebase-ios-sdk.git
Activer la connexion par e-mail par lien pour votre projet Firebase
Pour connecter des utilisateurs par lien e-mail, vous devez d'abord activer le fournisseur de messagerie et la méthode de connexion par lien e-mail pour votre projet Firebase :
- Dans la console Firebase , ouvrez la section Auth .
- Dans l'onglet Méthode de connexion , activez le fournisseur E-mail/Mot de passe . Notez que la connexion par e-mail/mot de passe doit être activée pour utiliser la connexion par lien e-mail.
- Dans la même section, activez la méthode de connexion par lien e-mail (connexion sans mot de passe) .
- Cliquez sur Enregistrer .
Envoyer un lien d'authentification à l'adresse email de l'utilisateur
Pour lancer le flux d'authentification, présentez à l'utilisateur une interface qui l'invite à fournir son adresse e-mail, puis appelez sendSignInLink
pour demander à Firebase d'envoyer le lien d'authentification vers l'adresse e-mail de l'utilisateur.
Construisez l'objet
ActionCodeSettings
, qui fournit à Firebase des instructions sur la façon de créer le lien de courrier électronique. Définissez les champs suivants :- url : le lien profond à intégrer et tout état supplémentaire à transmettre. Le domaine du lien doit être ajouté à la liste blanche dans la liste des domaines autorisés de la console Firebase, qui peut être trouvée en accédant à l'onglet Méthode de connexion (Authentification -> Méthode de connexion).
- 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 des liens d'action par 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 courrier électronique hors bande (réinitialisation du mot de passe et vérification des courriers électroniques). En effet, à la fin du flux, l'utilisateur est censé être connecté et son état d'authentification est conservé dans l'application.
- DynamicLinkDomain : lorsque plusieurs domaines de liens dynamiques personnalisés sont définis pour un projet, spécifiez celui à utiliser lorsque le lien doit être ouvert via une application mobile spécifiée (par exemple,
example.page.link
). Sinon, le premier domaine est automatiquement sélectionné.
Rapide
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")
Objectif 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, reportez-vous à la section Passing State in Email Actions .
Demandez à l'utilisateur son e-mail.
Envoyez le lien d'authentification à l'adresse e-mail de l'utilisateur et enregistrez l'e-mail de l'utilisateur au cas où l'utilisateur terminerait la connexion par e-mail sur le même appareil.
Rapide
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") // ... }
Objectif 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"]; // ... }];
Connectez-vous complètement avec le lien e-mail
Problèmes de sécurité
Pour éviter qu'un lien de connexion soit utilisé pour se connecter en tant qu'utilisateur involontaire ou sur un appareil involontaire, Firebase Auth exige que l'adresse e-mail de l'utilisateur soit fournie lors de la finalisation du processus de connexion. Pour que la connexion réussisse, cette adresse e-mail doit correspondre à l'adresse à laquelle le lien de connexion a été initialement envoyé.
Vous pouvez rationaliser ce flux pour les utilisateurs qui ouvrent le lien de connexion sur le même appareil sur lequel ils demandent le lien, en stockant leur adresse e-mail localement lorsque vous envoyez l'e-mail de connexion. Ensuite, utilisez cette adresse pour terminer le flux.
Une fois la connexion terminée, tout mécanisme de connexion antérieur non vérifié 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 vérifié avec le même e-mail et le même mot de passe, le mot de passe de l'utilisateur sera supprimé pour empêcher l'usurpateur qui a revendiqué la propriété et créé ce compte non vérifié de se reconnecter avec le même compte.
Terminer la connexion dans une application mobile Apple
L'authentification Firebase utilise Firebase Dynamic Links pour envoyer le lien de courrier électronique à un appareil mobile. Pour terminer la connexion 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 terminer la connexion.
Configuration des liens dynamiques Firebase
Firebase Auth utilise Firebase Dynamic Links lors de l'envoi d'un lien destiné à être ouvert dans une application mobile. Pour utiliser cette fonctionnalité, les liens dynamiques doivent être configurés dans la console Firebase.
Activer les liens dynamiques Firebase :
- Dans la console Firebase , ouvrez la section Liens dynamiques .
Si vous n'avez pas encore accepté les conditions Dynamic Links et créé un domaine Dynamic Links, faites-le maintenant.
Si vous avez déjà créé un domaine Dynamic Links, prenez-en note. Un domaine Dynamic Links ressemble généralement à l’exemple suivant :
example.page.link
Vous aurez besoin de cette valeur lorsque vous configurerez votre application Apple ou Android pour intercepter le lien entrant.
Configuration des applications Apple :
- Si vous prévoyez de gérer ces liens à partir de votre application, l'ID du bundle doit être spécifié dans les paramètres du projet de la console Firebase. De plus, l'identifiant App Store et l'identifiant Apple Developer Team doivent également être spécifiés.
- Vous devrez également configurer votre domaine de gestionnaire d'actions de courrier électronique en tant que domaine associé dans les fonctionnalités de votre application. Par défaut, le gestionnaire d'actions de courrier électronique est hébergé sur un domaine comme dans l'exemple suivant :
APP_ID.firebaseapp.com
- Si vous envisagez de distribuer votre application sur les versions iOS 8 et antérieures, vous devrez définir votre ID de bundle comme schéma personnalisé pour les URL entrantes.
- Pour en savoir plus, reportez-vous aux instructions de réception des liens dynamiques de la plateforme Apple .
Vérifiez le lien et connectez-vous
Après avoir reçu le lien comme décrit ci-dessus, vérifiez qu'il est destiné à l'authentification du lien de courrier électronique et complétez la connexion.
Rapide
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objectif 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 de courrier électronique dans une application Android, reportez-vous au guide Android .
Pour savoir comment gérer la connexion avec un lien de courrier électronique dans une application Web, reportez-vous au guide Web .
Liaison/réauthentification avec lien e-mail
Vous pouvez également lier cette méthode d'authentification à un utilisateur existant. Par exemple, un utilisateur préalablement authentifié auprès d'un autre fournisseur, tel qu'un numéro de téléphone, peut ajouter cette méthode de connexion à son compte existant.
La différence se situerait dans la seconde moitié de l’opération :
Rapide
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. }
Objectif 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. }];
Cela peut également être utilisé pour réauthentifier un utilisateur de lien de messagerie avant d'exécuter une opération sensible.
Rapide
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. }
Objectif 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. }];
Cependant, comme le flux peut aboutir sur un autre appareil sur lequel l'utilisateur d'origine n'était pas connecté, ce flux risque de ne pas aboutir. Dans ce cas, une erreur peut être affichée à l'utilisateur pour le forcer à ouvrir le lien sur le même appareil. Certains états peuvent être transmis dans le lien pour fournir des informations sur le type d'opération et l'UID de l'utilisateur.
Obsolète : différencier le mot de passe de courrier électronique du lien de courrier électronique
Si vous avez créé votre projet le 15 septembre 2023 ou après, la protection par énumération d'e-mails est activée par défaut. Cette fonctionnalité améliore la sécurité des comptes utilisateurs de votre projet, mais elle désactive la méthode fetchSignInMethodsForEmail()
, que nous recommandions auparavant pour implémenter les flux identifiant d'abord.
Bien que vous puissiez désactiver la protection de l’énumération des e-mails pour votre projet, nous vous déconseillons de le faire.
Consultez la documentation sur la protection de l'énumération des e-mails pour plus de détails.
Prochaines étapes
Après qu'un utilisateur se connecte pour la première fois, un nouveau compte utilisateur est créé et lié aux informations d'identification (c'est-à-dire le nom d'utilisateur et le mot de passe, le numéro de téléphone ou les informations du fournisseur d'authentification) avec lesquels l'utilisateur s'est connecté. Ce nouveau compte est stocké dans le cadre de votre projet Firebase et peut être utilisé pour identifier un utilisateur dans chaque application de votre projet, quelle que soit la manière dont l'utilisateur se connecte.
Dans vos applications, vous pouvez obtenir les informations de base du profil de l'utilisateur à partir de l'objet
User
. Voir Gérer les utilisateurs .Dans vos règles de sécurité Firebase Realtime Database et Cloud Storage, vous pouvez obtenir 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 application à l'aide de plusieurs fournisseurs d'authentification en associant les informations d'identification du fournisseur d'authentification à un compte utilisateur existant.
Pour déconnecter un utilisateur, appelez signOut:
.
Rapide
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objectif c
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Vous souhaiterez peut-être également ajouter un code de gestion des erreurs pour la gamme complète des erreurs d'authentification. Voir Gérer les erreurs .