Mit einer Telefonnummer und C++ bei Firebase authentifizieren

Mit Firebase Authentication können Sie einen Nutzer anmelden, indem Sie eine SMS-Nachricht an sein Smartphone senden. Der Nutzer meldet sich mit einem Einmalcode an, der in der SMS enthalten ist.

In diesem Dokument wird beschrieben, wie Sie einen Anmeldevorgang mit Telefonnummer mithilfe des Firebase SDK implementieren.

Hinweis

  1. Fügen Sie Ihrem C++ -Projekt Firebase hinzu.
  2. Wenn Sie Ihre App noch nicht mit Ihrem Firebase-Projekt verknüpft haben, tun Sie dies in der Firebase Konsole.
  3. Machen Sie sich mit den Plattformanforderungen für die Anmeldung mit Telefonnummer vertraut:
    • Die Anmeldung mit Telefonnummer ist nur für mobile Plattformen verfügbar.
    • Unter iOS ist für die Anmeldung mit Telefonnummer ein physisches Gerät erforderlich. Sie funktioniert nicht in einem Simulator.

Sicherheitsbedenken

Die Authentifizierung nur mit einer Telefonnummer ist zwar praktisch, aber weniger sicher als die anderen verfügbaren Methoden, da der Besitz einer Telefonnummer leicht zwischen Nutzern übertragen werden kann. Außerdem kann sich auf Geräten mit mehreren Nutzerprofilen jeder Nutzer, der SMS-Nachrichten empfangen kann, mit der Telefonnummer des Geräts in einem Konto anmelden.

Wenn Sie in Ihrer App die Anmeldung mit Telefonnummer verwenden, sollten Sie sie zusammen mit sichereren Anmeldemethoden anbieten und Nutzer über die Sicherheitsrisiken der Anmeldung mit Telefonnummer informieren.

Anmeldung mit Telefonnummer für Ihr Firebase-Projekt aktivieren

Wenn Sie Nutzer per SMS anmelden möchten, müssen Sie zuerst die Anmeldemethode „Telefonnummer“ für Ihr Firebase-Projekt aktivieren:

  1. Öffnen Sie in der Firebase Konsole den Bereich Authentifizierung.
  2. Aktivieren Sie auf der Seite Anmeldemethode die Anmeldemethode Telefonnummer.
  3. Legen Sie auf der Seite Einstellungen eine Richtlinie für die Regionen fest, an die Sie SMS-Nachrichten senden möchten oder nicht. Bei neuen Projekten sind in der Standardrichtlinie keine Regionen zulässig.

APNs-Benachrichtigungen erhalten (Apple-Plattformen)

Wenn Sie die Telefonnummernauthentifizierung auf Apple-Plattformen verwenden möchten, muss Ihre App APNs-Benachrichtigungen von Firebase empfangen können. Wenn Sie einen Nutzer zum ersten Mal mit seiner Telefon nummer auf einem Gerät anmelden, sendet Firebase Authentication eine stumme Push Benachrichtigung an das Gerät, um zu bestätigen, dass die Anmeldeanfrage mit Telefonnummer von Ihrer App stammt. Aus diesem Grund kann die Anmeldung mit Telefonnummer nicht in einem Simulator verwendet werden.

So aktivieren Sie APNs-Benachrichtigungen zur Verwendung mit Firebase Authentication:

  1. Aktivieren Sie in Xcode Push-Benachrichtigungen für Ihr Projekt.
  2. Laden Sie Ihr APNs-Zertifikat in Firebase hoch. Wenn Sie noch kein APNs Zertifikat haben, erstellen Sie eines im Apple Developer Member Center.

    1. Rufen Sie in der Firebase Konsole die Einstellungen > Allgemein auf. Klicken Sie dann auf den Cloud Messaging Tab.
    2. Klicken Sie für Ihr Entwicklungszertifikat, Ihr Produktionszertifikat oder beide auf Zertifikat hochladen. Mindestens eines ist erforderlich.
    3. Wählen Sie für jedes Zertifikat die .p12 Datei aus und geben Sie das Passwort ein, falls vorhanden. Achten Sie darauf, dass die Paket-ID für dieses Zertifikat mit der Paket-ID Ihrer App übereinstimmt. Klicken Sie auf Speichern.

Bestätigungscode an das Smartphone des Nutzers senden

Um die Anmeldung mit Telefonnummer zu starten, präsentieren Sie dem Nutzer eine Oberfläche, auf der er seine Telefonnummer angeben kann. Rufen Sie dann PhoneAuthProvider::VerifyPhoneNumber auf, um Firebase aufzufordern, einen Authentifizierungscode per SMS an das Smartphone des Nutzers zu senden:

  1. Rufen Sie die Telefonnummer des Nutzers ab.

    Die rechtlichen Anforderungen variieren. Als Best Practice und um die Erwartungen Ihrer Nutzer zu erfüllen, sollten Sie sie jedoch darüber informieren, dass sie bei der Anmeldung mit Telefonnummer möglicherweise eine SMS zur Bestätigung erhalten und dass die üblichen Gebühren anfallen.

  2. Rufen Sie PhoneAuthProvider::VerifyPhoneNumber auf und übergeben Sie die Telefonnummer des Nutzers.
    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);
    Wenn Sie PhoneAuthProvider::VerifyPhoneNumber aufrufen, sendet Firebase
    • (unter iOS) eine stumme Push-Benachrichtigung an Ihre App,
    • eine SMS mit einem Authentifizierungscode an die angegebene Telefonnummer und übergibt eine Bestätigungs-ID an Ihre Abschlussfunktion. Sie benötigen sowohl den Bestätigungscode als auch die Bestätigungs-ID, um den Nutzer anzumelden.
  3. Speichern Sie die Bestätigungs-ID und stellen Sie sie wieder her, wenn Ihre App geladen wird. So haben Sie weiterhin eine gültige Bestätigungs-ID, wenn Ihre App beendet wird, bevor der Nutzer den Anmeldevorgang abgeschlossen hat (z. B. beim Wechsel zur SMS-App).

    Sie können die Bestätigungs-ID auf beliebige Weise speichern. Wenn Sie mit einem plattformübergreifenden C++-Framework schreiben, sollte es Benachrichtigungen für das Beenden und Wiederherstellen von Apps bereitstellen. Bei diesen Ereignissen können Sie die Bestätigungs-ID speichern bzw. wiederherstellen.

Wenn der Aufruf von VerifyPhoneNumber dazu führt, dass OnCodeSent für Ihren Listener aufgerufen wird, können Sie den Nutzer auffordern, den Bestätigungscode einzugeben, wenn er ihn in der SMS erhält.

Wenn der Aufruf von VerifyPhoneNumber hingegen zu OnVerificationCompleted führt, war die automatische Bestätigung erfolgreich und Sie haben jetzt ein PhoneAuthCredential, das Sie wie unten beschrieben verwenden können.

Nutzer mit dem Bestätigungscode anmelden

Nachdem der Nutzer Ihrer App den Bestätigungscode aus der SMS mitgeteilt hat, melden Sie ihn an, indem Sie ein PhoneAuthCredential Objekt aus dem Bestätigungscode und der Bestätigungs-ID erstellen und dieses Objekt an Auth::SignInWithCredential übergeben.

  1. Rufen Sie den Bestätigungscode vom Nutzer ab.
  2. Erstellen Sie ein Credential Objekt aus dem Bestätigungscode und Bestätigungs-ID.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Melden Sie den Nutzer mit dem Credential-Objekt an:
    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);

Nächste Schritte

Wenn sich ein Nutzer zum ersten Mal anmeldet, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, mit denen sich der Nutzer angemeldet hat, d. h. mit dem Nutzernamen und Passwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps Ihres Projekts zu identifizieren, unabhängig davon, wie sich der Nutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem firebase::auth::User Objekt abrufen:

    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();
    }
  • In den Firebase Realtime Database und Cloud Storage Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.

Sie können Nutzern erlauben, sich mit mehreren Authentifizierungsanbietern in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.

Rufen Sie SignOut() auf, um einen Nutzer abzumelden:

auth->SignOut();