S'authentifier avec Firebase à l'aide d'un numéro de téléphone et de C++

Vous pouvez utiliser Firebase Authentication pour connecter un utilisateur en envoyant un SMS au téléphone de l'utilisateur. L'utilisateur se connecte à l'aide d'un code à usage unique contenu dans le SMS.

Ce document explique comment mettre en œuvre un processus de connexion par numéro de téléphone à l'aide de le SDK Firebase.

Avant de commencer

  1. Ajouter Firebase à votre environnement C++ projet.
  2. Si vous n'avez pas encore associé votre application à votre projet Firebase, faites-le depuis la console Firebase.
  3. Découvrez les exigences liées aux plates-formes pour la connexion avec un numéro de téléphone :
    • La connexion par numéro de téléphone est réservée aux plates-formes mobiles.
    • Sur iOS, la connexion avec un numéro de téléphone nécessite un appareil physique et ne fonctionne pas sur un simulateur.

Problèmes de sécurité

L'authentification par simple numéro de téléphone est moins sécurisée, même si elle est pratique. que les autres méthodes disponibles, car la possession d'un numéro de téléphone peuvent être facilement transférés d'un utilisateur à l'autre. De plus, sur les appareils dotés de plusieurs profil, tout utilisateur pouvant recevoir des SMS peut se connecter à un compte en utilisant le numéro de téléphone de l’appareil.

Si vous utilisez la connexion par numéro de téléphone dans votre application, vous devez l'offrir en plus de méthodes de connexion plus sécurisées et informer les utilisateurs des compromis de sécurité liés à l'utilisation de la connexion par numéro de téléphone.

Activer la connexion par numéro de téléphone pour votre projet Firebase

Pour connecter les utilisateurs par SMS, vous devez d'abord activer la connexion par numéro de téléphone pour votre projet Firebase:

  1. Dans la console Firebase, ouvrez la section Authentication (Authentification).
  2. Sur la page Sign-in Method (Mode de connexion), activez la méthode de connexion Phone Number (Numéro de téléphone).

Commencer à recevoir des notifications APN (plates-formes Apple)

Pour que vous puissiez utiliser l'authentification par numéro de téléphone sur les plates-formes Apple, votre application doit pouvoir recevoir Notifications APNs de Firebase. Lorsque vous connectez un utilisateur avec son téléphone numéro de téléphone pour la première fois sur un appareil, Firebase Authentication envoie une notification push silencieuse à l'appareil pour vérifier que la demande de connexion via le numéro de téléphone provient de votre application. (C'est pourquoi vous ne pouvez pas vous connecter via un numéro de téléphone sur un simulateur.)

Pour activer les notifications APNs à utiliser avec Firebase Authentication:

  1. Dans Xcode, activer les notifications push pour votre projet.
  2. Importez votre certificat APNs dans Firebase. Si vous ne possédez pas encore de certificat APNs, veillez à en créer un dans le Apple Developer Member Center.

    1. Dans votre projet dans la console Firebase, sélectionnez le l'icône en forme de roue dentée, sélectionnez Paramètres du projet, puis sélectionnez le Onglet Cloud Messaging.

    2. Sélectionnez l'option Importer un certificat. pour votre certificat de développement, certificat de production, ou les deux. Au moins une est obligatoire.

    3. Pour chaque certificat, sélectionnez le fichier .p12 et fournissez le mot de passe, le cas échéant. Assurez-vous que l'ID du bundle pour ce certificat correspond à l'ID de bundle de votre application. Sélectionner Enregistrer.

Envoyer un code de validation sur le téléphone de l'utilisateur

Pour lancer la connexion par numéro de téléphone, présentez à l'utilisateur une interface qui l'invite à fournir son numéro de téléphone, puis appelez PhoneAuthProvider::VerifyPhoneNumber pour demander à Firebase d'envoyer un code d'authentification au téléphone de l'utilisateur par SMS :

  1. Obtenez le numéro de téléphone de l'utilisateur.

    Les obligations légales varient, mais il est recommandé et de définir les attentes de vos utilisateurs, vous devez les informer que s'ils utilisent connexion par téléphone, il est possible qu'il reçoive un SMS de validation et s'appliquent.

  2. Appelez PhoneAuthProvider::VerifyPhoneNumber, en lui transmettant l'ID numéro de téléphone.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuhtOptions options;
    options.timeout_milliseconds = kAutoVerifyTimeOut;
    options.phone_number = phone_number;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(options, &phone_listener);
    Lorsque vous appelez PhoneAuthProvider::VerifyPhoneNumber, Firebase
    • (sur iOS) envoie une notification push silencieuse à votre application ;
    • envoie un SMS contenant un code d'authentification au numéro de téléphone et transmet un identifiant de validation à votre fonction d'achèvement. Vous aurez besoin du code et de la pièce d'identité de validation pour connecter l'utilisateur.
  3. Enregistrez l'ID de validation et restaurez-le lors du chargement de votre application. Ce faisant, vous pouvez vous assurer que vous disposez toujours d'un ID de validation valide si votre application est est interrompue avant que l'utilisateur ne termine le processus de connexion (par exemple, en passant à l'application SMS).

    Vous pouvez conserver l'ID de validation comme vous le souhaitez. Si vous écrivez avec un framework C++ multiplate-forme, il doit fournir des notifications de fermeture et de restauration de l'application. Vous pouvez enregistrer et restaurer ces événements, respectivement l'identifiant de validation.

Si l'appel de VerifyPhoneNumber génère OnCodeSent appelé sur votre Listener, vous pouvez inviter l'utilisateur à saisir la clé de validation s'il le reçoit par SMS.

En revanche, si l'appel à VerifyPhoneNumber génère OnVerificationCompleted, la validation automatique a réussi Vous disposez maintenant d'un PhoneAuthCredential que vous pouvez utiliser comme décrit ici. ci-dessous.

Connecter l'utilisateur avec le code de validation

Une fois que l'utilisateur a fourni le code de validation envoyé par SMS à votre application connectez l'utilisateur en créant un PhoneAuthCredential du code de validation et de l'identifiant de validation, puis en transmettant cet objet à Auth::SignInWithCredential.

  1. Obtenez le code de validation auprès de l'utilisateur.
  2. Créez un objet Credential à partir du code de validation et un identifiant de validation.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Connectez l'utilisateur avec l'objet Credential :
    Future<User> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            User user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user.phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user.uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user.provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);

É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 il s'est connecté. Cette nouvelle est stocké dans votre projet Firebase et peut servir à identifier un utilisateur dans toutes les applications de votre projet, quelle que soit la façon dont l'utilisateur se connecte.

  • Dans vos applications, vous pouvez obtenir les informations de profil de base de l'utilisateur à partir de l'objet firebase::auth::User :

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
  • 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():

auth->SignOut();