Uwierzytelniaj w Firebase przy użyciu numeru telefonu i języka C++

Za pomocą Firebase Authentication możesz zalogować użytkownika, wysyłając SMS-a do telefonu użytkownika. Użytkownik loguje się za pomocą jednorazowego kodu zawartego w SMS.

W tym dokumencie opisujemy, jak wdrożyć proces logowania się przy użyciu numeru telefonu za pomocą pakiet SDK Firebase.

Zanim zaczniesz

  1. Dodaj Firebase do swojego C++ projekt.
  2. Jeśli Twoja aplikacja nie jest jeszcze połączona z projektem Firebase, zrób to na stronie konsolę Firebase.
  3. Zapoznaj się z wymaganiami platformy dotyczącymi logowania się za pomocą numeru telefonu:
    • Logowanie się za pomocą numeru telefonu jest możliwe tylko na platformach mobilnych.
    • W systemie iOS logowanie się za pomocą numeru telefonu wymaga fizycznego urządzenia i nie działa na symulatorze.

Potencjalne problemy z bezpieczeństwem

Uwierzytelnianie przy użyciu numeru telefonu, choć jest wygodne, jest mniej bezpieczne niż inne dostępne metody, ponieważ posiadanie numeru telefonu można łatwo przenosić między użytkownikami. Także na urządzeniach z wieloma użytkownikami profili, każdy użytkownik, który może odbierać wiadomości SMS, może zalogować się na konto przy użyciu z numerem telefonu urządzenia.

Jeśli w aplikacji korzystasz z logowania się na podstawie numeru telefonu, z bezpieczniejszymi metodami logowania oraz informować użytkowników logowanie się przy użyciu numeru telefonu.

Włączanie logowania się za pomocą numeru telefonu w projekcie Firebase

Aby logować użytkowników za pomocą SMS-ów, musisz najpierw włączyć logowanie się przy użyciu numeru telefonu do swojego projektu Firebase:

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  2. Na stronie Sign-in Method (Metoda logowania) włącz Phone Number. metody logowania się.

Zacznij otrzymywać powiadomienia APNs (platformy Apple)

Aby korzystać z uwierzytelniania przez numer telefonu na platformach Apple, aplikacja musi mieć możliwość odbierania Powiadomienia APNs z Firebase. Gdy logujesz użytkownika za pomocą telefonu po raz pierwszy na urządzeniu, Firebase Authentication wysyła ciche push powiadomienie na urządzenie, by potwierdzić, że prośba o zalogowanie się numer telefonu pochodzi z aplikacji. (Z tego powodu nie można zalogować się za pomocą numeru telefonu w symulatorze).

Aby włączyć powiadomienia APNs na potrzeby usługi Firebase Authentication:

  1. W Xcode włączyć powiadomienia push w projekcie.
  2. Prześlij certyfikat APNs do Firebase. Jeśli nie masz jeszcze certyfikatu APNs, utwórz go w Apple Developer Member Center

    1. W projekcie w konsoli Firebase wybierz ikona koła zębatego, wybierz Ustawienia projektu i wybierz Komunikacja w chmurze.

    2. Wybierz Prześlij certyfikat. certyfikatu programistycznego, certyfikatu produkcji lub obu tych rodzajów danych. Co najmniej 1

    3. Dla każdego certyfikatu wybierz plik .p12 i wskaż i hasło. Sprawdź, czy identyfikator pakietu tego certyfikatu pasuje do identyfikatora pakietu Twojej aplikacji. Wybierz Zapisz.

Wysyłanie kodu weryfikacyjnego na telefon użytkownika

Aby rozpocząć logowanie za pomocą numeru telefonu, użyj interfejsu z prośbą o wyświetlenie prośby podać swój numer telefonu, a następnie zadzwonić PhoneAuthProvider::VerifyPhoneNumber, aby poprosić Firebase o wysłanie przy użyciu SMS-a z kodem uwierzytelniającym:

  1. Uzyskaj numer telefonu użytkownika.

    Wymagania prawne są różne, ale jest to sprawdzona metoda i określać oczekiwania użytkowników, należy ich poinformować, przez telefon, mogą otrzymać SMS-a w celu weryfikacji i standardowego obowiązują opłaty.

  2. Wywołaj PhoneAuthProvider::VerifyPhoneNumber, przekazując do niego numeru telefonu.
    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);
    Gdy zadzwonisz do aplikacji PhoneAuthProvider::VerifyPhoneNumber, Firebase,
    • (w iOS) wysyła do aplikacji ciche powiadomienie push,
    • wysyła do podanego numeru SMS-a z kodem uwierzytelniającym numeru telefonu i przekazuje identyfikator weryfikacyjny do funkcji uzupełniania. Musisz podać zarówno kod weryfikacyjny, jak i identyfikator weryfikacyjny, aby zaloguj się na swoje konto użytkownika.
  3. Zapisz identyfikator weryfikacyjny i przywróć go po załadowaniu aplikacji. Dzięki temu możesz sprawdzić, czy Twoja aplikacja jest nadal ważnym identyfikatorem weryfikacyjnym. kończy się, zanim użytkownik zakończy proces logowania (na przykład na aplikację do SMS-ów).

    Identyfikator weryfikacyjny możesz zachować w dowolny sposób. Jeśli piszesz wykorzystujący wieloplatformową platformę C++, powinien dostarczać powiadomienia zakończenia i przywracania danych. Możesz je zapisywać i przywracać, identyfikator weryfikacji.

Jeśli wywołanie VerifyPhoneNumber kończy się OnCodeSent na swoim detektorze, możesz poprosić użytkownika o wpisanie kodu weryfikacyjnego po otrzymaniu go w wiadomości SMS.

Jeśli natomiast wywołanie VerifyPhoneNumber spowoduje OnVerificationCompleted, automatyczna weryfikacja się powiodła i będziesz teraz mieć PhoneAuthCredential, którego możesz używać zgodnie z opisem. poniżej.

Logowanie użytkownika za pomocą kodu weryfikacyjnego

Gdy użytkownik poda aplikacji kod weryfikacyjny z SMS-a zaloguj użytkownika, tworząc PhoneAuthCredential z kodu weryfikacyjnego i identyfikatora weryfikacji i przekazując ten obiekt, do: Auth::SignInWithCredential.

  1. Uzyskaj kod weryfikacyjny od użytkownika.
  2. Utwórz obiekt Credential z kodu weryfikacyjnego i identyfikator weryfikacji.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Zaloguj użytkownika za pomocą obiektu 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);

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, tworzone jest nowe konto użytkownika. powiązane z danymi logowania, czyli z nazwą użytkownika, hasłem i numerem telefonu, numer telefonu lub informacje o dostawcy uwierzytelniania – użytkownik zalogowany. Ten nowy jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od tego, jak się loguje.

  • W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z Obiekt 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();
    }
  • Na liście Firebase Realtime Database i Cloud Storage regułami zabezpieczeń, pobierz ze zmiennej auth unikalny identyfikator zalogowanego użytkownika, i używać ich do kontrolowania, do jakich danych użytkownik ma dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu wielokrotnego uwierzytelniania. dostawców, łącząc dane logowania dostawcy uwierzytelniania z istniejącego konta użytkownika.

Aby wylogować użytkownika, wywołaj SignOut():

auth->SignOut();