Catch up on everything we announced at this year's Firebase Summit. Learn more

Authentifizieren Sie sich bei Firebase mit einer Telefonnummer und C++

Sie können Firebase Authentication verwenden, um einen Benutzer anzumelden, indem Sie eine SMS-Nachricht an das Telefon des Benutzers senden. Der Benutzer meldet sich mit einem Einmalcode an, der in der SMS-Nachricht enthalten ist.

In diesem Dokument wird beschrieben, wie Sie mit dem Firebase SDK einen Anmeldevorgang für eine Telefonnummer implementieren.

Bevor Sie beginnen

  1. In Firebase zu Ihrem C ++ Projekt .
  2. Wenn Sie noch nicht Ihre App auf Ihr Projekt verbunden Firebase, tun Sie dies aus der Firebase Konsole .

Beachten Sie auf Apple-Plattformen, dass die Anmeldung per Telefonnummer ein physisches Gerät erfordert und auf einem Simulator nicht funktioniert.

Sicherheitsbedenken

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

Wenn Sie die telefonnummernbasierte Anmeldung in Ihrer App verwenden, sollten Sie diese neben sichereren Anmeldemethoden anbieten und die Benutzer über die Sicherheitsabwägungen bei der Verwendung der Telefonnummernanmeldung informieren.

Aktivieren Sie die Telefonnummern-Anmeldung für Ihr Firebase-Projekt

Um Benutzer per SMS anzumelden, müssen Sie zunächst die Anmeldemethode Telefonnummer für Ihr Firebase-Projekt aktivieren:

  1. In der Firebase Konsole öffnen den Abschnitt Authentication.
  2. Auf der Sign-in - Methode Seite, aktivieren Sie die Telefonnummer Anmelde-Verfahren.

Das Kontingent von Firebase-Anmeldeanfragen für Telefonnummern ist hoch genug, sodass die meisten Apps nicht betroffen sind. Wenn Sie jedoch eine sehr große Anzahl von Benutzern mit Telefonauthentifizierung anmelden müssen, müssen Sie möglicherweise Ihren Preisplan aktualisieren. Siehe die Preisseite.

Beginnen Sie mit dem Empfang von APNs-Benachrichtigungen (Apple-Plattformen)

Um die Telefonnummerauthentifizierung auf Apple-Plattformen zu verwenden, muss Ihre App APNs-Benachrichtigungen von Firebase empfangen können. Wenn Sie einen Benutzer zum ersten Mal mit seiner Telefonnummer auf einem Gerät anmelden, sendet Firebase Authentication eine stille Push-Benachrichtigung an das Gerät, um zu überprüfen, ob die Telefonnummer-Anmeldeanforderung von Ihrer App stammt. (Aus diesem Grund kann die Telefonnummern-Anmeldung in einem Simulator nicht verwendet werden.)

So aktivieren Sie APNs-Benachrichtigungen für die Verwendung mit Firebase Authentication:

  1. In Xcode, ermöglicht Push - Benachrichtigungen für Ihr Projekt.
  2. Laden Sie Ihr APNs-Zertifikat in Firebase hoch. Wenn Sie nicht bereits über ein APNs - Zertifikat haben, stellen Sie sicher , dass man in der erstellen Apple Developer Member Center .

    1. In Ihrem Projekt in der Firebase - Konsole, wählen Sie das Zahnradsymbol, Projekteinstellungen auswählen und anschließend die Cloud Messaging Registerkarte.

    2. Wählen Sie das Zertifikat hochladen Schaltfläche für Ihre Entwicklung Zertifikat, Ihre Produktionsbescheinigung oder beides. Mindestens einer ist erforderlich.

    3. Wählen Sie für jedes Zertifikat die .p12-Datei aus und geben Sie ggf. das Kennwort ein. Stellen Sie sicher, dass die Bundle-ID für dieses Zertifikat mit der Bundle-ID Ihrer App übereinstimmt. Wählen Sie Speichern.

Senden Sie einen Bestätigungscode an das Telefon des Benutzers

So initiieren Telefonnummer Sign-in, präsentieren dem Anwender eine Schnittstelle , die Aufforderungen sie ihre Telefonnummer zur Verfügung zu stellen, und rufen Sie dann PhoneAuthProvider::VerifyPhoneNumber auf Anfrage , dass Firebase einen Authentifizierungscode an das Telefon des Benutzers per SMS senden:

  1. Rufen Sie die Telefonnummer des Benutzers ab.

    Die rechtlichen Anforderungen variieren, aber als Best Practice und um die Erwartungen Ihrer Benutzer zu erfüllen, sollten Sie sie darüber informieren, dass sie bei der telefonischen Anmeldung möglicherweise eine SMS-Nachricht zur Bestätigung erhalten und Standardtarife gelten.

  2. Rufen Sie PhoneAuthProvider::VerifyPhoneNumber , vorbei an ihm die Telefonnummer des Benutzers.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential 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;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    Wenn Sie anrufen PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (auf iOS) sendet eine stille Push-Benachrichtigung an Ihre App,
    • sendet eine SMS-Nachricht mit einem Authentifizierungscode an die angegebene Telefonnummer und übergibt eine Verifizierungs-ID an Ihre Abschlussfunktion. Sie benötigen sowohl den Verifizierungscode als auch die Verifizierungs-ID, um den Benutzer anzumelden.
  3. Speichern Sie die Verifizierungs-ID und stellen Sie sie wieder her, wenn Ihre App geladen wird. Auf diese Weise können Sie sicherstellen, dass Sie weiterhin über eine gültige Verifizierungs-ID verfügen, wenn Ihre App beendet wird, bevor der Benutzer den Anmeldevorgang abgeschlossen hat (z. B. beim Wechsel zur SMS-App).

    Sie können die Verifizierungs-ID beliebig beibehalten. Wenn Sie mit einem plattformübergreifenden C++-Framework schreiben, sollte es Benachrichtigungen zum Beenden und Wiederherstellen der App bereitstellen. Bei diesen Ereignissen können Sie die Verifizierungs-ID speichern bzw. wiederherstellen.

Wenn der Aufruf von VerifyPhoneNumber Ergebnissen in OnCodeSent auf Ihrem Listener aufgerufen wird, können Sie den Benutzer auffordern , den Bestätigungscode einzugeben , wenn sie es in der SMS - Nachricht empfangen.

Auf der anderen Seite, wenn der Anruf zu VerifyPhoneNumber Ergebnissen in OnVerificationCompleted , dann automatische Überprüfung gelungen ist , und Sie haben jetzt eine Credential , mit dem Sie wie unten beschrieben , verwendet werden können.

Melden Sie den Benutzer mit dem Bestätigungscode an

Nachdem der Benutzer der App mit dem Bestätigungscode aus der SMS - Nachricht liefert, unterzeichnet den Benutzer in durch die Schaffung eines Credential - Objekts aus dem Bestätigungscode und Verifikation ID und vorbei , das Objekt zu Auth::SignInWithCredential .

  1. Holen Sie sich den Bestätigungscode vom Benutzer.
  2. Erstellen Sie ein Credential - Objekt aus dem Bestätigungscode und Überprüfung ID.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Anmeldung der Benutzer mit dem Credential - Objekt:
    Future<User*> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            const 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 Benutzer zum ersten Mal anmeldet, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – d. h. Benutzername und Kennwort, Telefonnummer oder Authentifizierungsanbieterinformationen – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Anwendungen können Sie die Benutzerprofilgrundinformationen aus dem erhaltenen firebase::auth::User

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      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 Ihrer Datenbank und Firebase Realtime Cloud Storage Sicherheitsregeln , können Sie die angemeldeten Nutzer die eindeutige Benutzer - ID aus der bekommen auth Variable, und es verwenden , um steuern kann ein Benutzer Zugriff , welche Daten.

Sie können Benutzer erlauben , durch mehrere Authentifizierungsanbieter anmelden, um Ihre App Verknüpfung Auth - Provider - Anmeldeinformationen zu einem vorhandenen Benutzerkonto.

Um einen Benutzer abzumelden, rufen SignOut() :

auth->SignOut();