Mit einer Telefonnummer und C++ bei Firebase authentifizieren

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

In diesem Dokument wird beschrieben, wie Sie einen Anmeldeablauf für Telefonnummern mit dem Firebase SDK implementieren.

Hinweis

  1. Fügen Sie Firebase zu Ihrem C++ Projekt hinzu.
  2. Wenn Sie Ihre App noch nicht mit Ihrem Firebase-Projekt verknüpft haben, tun Sie dies in der Firebase Konsole.
  3. Beachten Sie die Plattformanforderungen für die Anmeldung mit einer Telefonnummer:
    • Die Anmeldung mit einer Telefonnummer ist nur für mobile Plattformen verfügbar.
    • Unter iOS ist für die Anmeldung mit einer 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 Benutzerprofilen 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 einer Telefonnummer verwenden, sollten Sie sie zusammen mit sichereren Anmeldemethoden anbieten und Nutzer über die Sicherheitsrisiken der Anmeldung mit einer Telefonnummer informieren.

Anmeldung mit einer Telefonnummer für Ihr Firebase-Projekt aktivieren

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

  1. Rufen Sie in der Firebase Console Security > Authentication auf.
  2. Aktivieren Sie auf dem Tab Anmeldemethode den Anmeldeanbieter Telefon.
  3. Legen Sie eine Richtlinie für die Regionen fest, in denen Sie das Senden von SMS-Nachrichten zulassen oder ablehnen möchten. Durch das Festlegen einer Richtlinie für SMS-Regionen können Sie Ihre Apps vor SMS-Missbrauch schützen. Bei neuen Projekten sind in der Standardrichtlinie keine Regionen zulässig.
    1. Rufen Sie in der Firebase Console den Tab Sicherheit > Authentifizierung > Einstellungen auf.
    2. Richten Sie im Abschnitt Richtlinie für SMS-Regionen Ihre Richtlinie für SMS-Regionen ein.

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 für die Telefonnummer von Ihrer App stammt. Aus diesem Grund kann die Anmeldung mit einer 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 Console 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 Mobiltelefon des Nutzers senden

Um die Anmeldung mit einer 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 Mobiltelefon 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 einer 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,
    • sendet 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 können Sie sicherstellen, dass Sie weiterhin eine gültige Bestätigungs-ID haben, wenn Ihre App beendet wird, bevor der Nutzer den Anmeldeablauf abgeschlossen hat (z. B. beim Wechsel zur SMS-App).

    Sie können die Bestätigungs-ID auf beliebige Weise beibehalten. 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 in Ihrem 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 den Nutzer 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

Nachdem sich ein Nutzer zum ersten Mal angemeldet hat, 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.

Wenn Sie einen Nutzer abmelden möchten, rufen Sie SignOut() auf:

auth->SignOut();