Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

S'authentifier auprès de Firebase à l'aide de liens de messagerie

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

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 vérifiée.

La connexion par e-mail présente de nombreux avantages :

  • Inscription et connexion à faible friction.
  • Risque réduit de réutilisation des mots de passe dans les applications, ce qui peut nuire à 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. Il n'est pas nécessaire de posséder un numéro de téléphone ou un compte de réseau social.
  • 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 être 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 uniquement avec l'e-mail. Par exemple, un utilisateur qui a oublié son mot de passe peut toujours se connecter sans avoir à réinitialiser son mot de passe.

Avant que tu commences

  1. Si vous ne l'avez pas déjà fait, suivez les étapes du guide de démarrage .

  2. Activez la connexion par lien de messagerie pour votre projet Firebase.

    Pour connecter les utilisateurs par lien e-mail, vous devez d'abord activer la méthode de connexion Fournisseur de messagerie et Lien e-mail pour votre projet Firebase :

    1. Dans la console Firebase , ouvrez la section Auth .
    2. Dans l'onglet Méthode de connexion, activez le fournisseur d' adresse 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.
    3. Dans la même section, activez la méthode de connexion par lien par e-mail (connexion sans mot de passe) .
    4. Cliquez sur Enregistrer .

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

  1. Construisez l'objet ActionCodeSettings, qui fournit à Firebase des instructions sur la façon de construire le lien de messagerie. Définissez les champs suivants :

    • url : le lien profond à intégrer et tout état supplémentaire à transmettre. Le domaine du lien doit être sur liste blanche dans la liste des domaines autorisés de la console Firebase, qui peut être trouvée en allant dans l'onglet Méthode de connexion (Authentification -> Méthode de connexion). Le lien redirigera l'utilisateur vers cette URL si l'application n'est pas installée sur son appareil et que l'application n'a pas pu être installée.

    • androidPackageName et IOSBundleId : les applications à utiliser lorsque le lien de connexion est ouvert sur un appareil Android ou iOS. En savoir plus sur la configuration de 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 de messagerie hors bande (réinitialisation du mot de passe et vérifications des e-mails). En effet, à la fin du flux, l'utilisateur est censé être connecté et son état Auth persiste 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é.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. Demandez à l'utilisateur son e-mail.

  3. Envoyez le lien d'authentification à l'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.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

Problèmes de sécurité

Pour empêcher qu'un lien de connexion ne soit utilisé pour se connecter en tant qu'utilisateur non prévu ou sur un appareil non prévu, 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 qu'ils demandent le lien, en stockant leur adresse e-mail localement - par exemple en utilisant SharedPreferences - lorsque vous envoyez l'e-mail de connexion. Ensuite, utilisez cette adresse pour terminer le flux. Ne passez pas l'email de l'utilisateur dans les paramètres de l'URL de redirection et réutilisez-le car cela pourrait permettre des injections de session.

Une fois la connexion terminée, tout mécanisme de connexion précédent non vérifié sera supprimé de l'utilisateur et toutes les sessions existantes seront invalidées. Par exemple, si quelqu'un a précédemment créé un compte non vérifié avec la même adresse e-mail et le même mot de passe, le mot de passe de l'utilisateur sera supprimé pour empêcher l'imitateur qui a revendiqué la propriété et créé ce compte non vérifié de se reconnecter avec l'adresse e-mail et le mot de passe non vérifiés.

Assurez-vous également d'utiliser une URL HTTPS en production pour éviter que votre lien ne soit potentiellement intercepté par des serveurs intermédiaires.

Firebase Authentication utilise Firebase Dynamic Links pour envoyer le lien de l'e-mail à un appareil mobile. Pour terminer la connexion via l'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.

  1. Configurez votre application pour recevoir des liens dynamiques sur Flutter dans le guide .

  2. Dans votre gestionnaire de liens, vérifiez si le lien est destiné à l'authentification du lien de messagerie et, si c'est le cas, terminez le processus de connexion.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

Vous pouvez également lier cette méthode d'authentification à un utilisateur existant. Par exemple, un utilisateur précédemment 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 :

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

Cela peut également être utilisé pour ré-authentifier un utilisateur de lien e-mail avant d'exécuter une opération sensible.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

Cependant, comme le flux peut se retrouver sur un appareil différent sur lequel l'utilisateur d'origine n'était pas connecté, ce flux peut ne pas être terminé. Dans ce cas, une erreur peut être signalée à l'utilisateur pour le forcer à ouvrir le lien sur le même appareil. Certains états peuvent être passés dans le lien pour fournir des informations sur le type d'opération et l'UID de l'utilisateur.

Si vous prenez en charge à la fois la connexion par mot de passe et par lien avec e-mail, pour différencier la méthode de connexion d'un utilisateur par mot de passe/lien, utilisez fetchSignInMethodsForEmail . Ceci est utile pour les flux d'identifiant d'abord où l'utilisateur est d'abord invité à fournir son adresse e-mail, puis présenté avec la méthode de connexion :

try {
    final signInMethods =
        await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
    final userExists = signInMethods.isNotEmpty;
    final canSignInWithLink = signInMethods
        .contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
    final canSignInWithPassword = signInMethods
        .contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
    switch (exception.code) {
        case "invalid-email":
            print("Not a valid email address.");
            break;
        default:
            print("Unknown error.");
    }
}

Comme décrit ci-dessus, l'e-mail/mot de passe et l'e-mail/lien sont considérés comme le même EmailAuthProvider (même PROVIDER_ID ) avec différentes méthodes de connexion.

Prochaines étapes

Une fois qu'un utilisateur a créé un nouveau compte, ce 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 méthode de connexion utilisée par l'utilisateur.

Dans vos applications, vous pouvez obtenir les informations de base du profil de l' User à partir de l'objet Utilisateur. 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 liant les informations d'identification du fournisseur d'authentification ) à un compte utilisateur existant.

Pour déconnecter un utilisateur, appelez signOut() :

await FirebaseAuth.instance.signOut();