Esegui l'autenticazione con Firebase utilizzando un numero di telefono e C++

Puoi utilizzare Firebase Authentication per accedere a un utente tramite l'invio di un messaggio SMS al telefono dell'utente. L'utente accede utilizzando un codice monouso contenuto nel messaggio SMS.

Questo documento descrive come implementare un flusso di accesso tramite numero di telefono utilizzando l'SDK Firebase.

Prima di iniziare

  1. Aggiungi Firebase a C++ progetto.
  2. Se non hai ancora collegato la tua app al progetto Firebase, puoi farlo da la console Firebase.
  3. Informazioni sui requisiti di piattaforma per l'accesso tramite numero di telefono:
    • L'accesso tramite numero di telefono è disponibile solo per le piattaforme mobile.
    • Su iOS, l'accesso tramite numero di telefono richiede un dispositivo fisico e non funziona su un simulatore.

Problemi di sicurezza

L'autenticazione utilizzando solo un numero di telefono, sebbene comoda, è meno sicura rispetto agli altri metodi disponibili, perché il possesso di un numero di telefono può essere trasferito facilmente da un utente all'altro. Inoltre, sui dispositivi con più utenti profili, qualsiasi utente in grado di ricevere messaggi SMS può accedere a un account utilizzando il numero di telefono del dispositivo.

Se nella tua app usi l'accesso basato su numero di telefono, dovresti offrirlo oltre a metodi di accesso più sicuri, oltre a informare gli utenti del livello i pro e i contro dell'uso dell'accesso con numero di telefono.

Abilita l'accesso con numero di telefono per il tuo progetto Firebase

Per accedere agli utenti tramite SMS, devi prima abilitare l'accesso tramite numero di telefono per il tuo progetto Firebase:

  1. Nella console Firebase, apri la sezione Autenticazione.
  2. Nella pagina Metodo di accesso, attiva il metodo di accesso Numero di telefono.

Iniziare a ricevere notifiche APN (piattaforme Apple)

Per usare l'autenticazione del numero di telefono sulle piattaforme Apple, la tua app deve poter ricevere Notifiche del servizio APN da Firebase. Quando esegui l'accesso di un utente con il suo smartphone numero per la prima volta su un dispositivo, Firebase Authentication invia un push silenzioso al dispositivo per verificare che la richiesta di accesso tramite numero di telefono proviene dalla tua app. Per questo motivo, non è possibile usare l'accesso tramite numero di telefono su un simulatore.)

Per attivare le notifiche del servizio APN da utilizzare con Firebase Authentication:

  1. In Xcode, attiva le notifiche push per il tuo progetto.
  2. Carica il certificato del servizio APN su Firebase. Se non hai ancora un certificato APNs, assicurati di crearne uno nel Centro per gli sviluppatori Apple.

    1. All'interno del progetto nella console Firebase, seleziona icona a forma di ingranaggio, seleziona Impostazioni progetto, quindi seleziona Scheda Cloud Messaging.

    2. Seleziona il Certificato di caricamento. per il certificato di sviluppo, di produzione o entrambi. Almeno uno è obbligatorio.

    3. Per ogni certificato, seleziona il file .p12 e fornisci la password, se presente. Assicurati che l'ID pacchetto per questo certificato corrisponda all'ID pacchetto della tua app. Seleziona Salva.

Invia un codice di verifica al telefono dell'utente

Per avviare l'accesso tramite numero di telefono, presenta all'utente un'interfaccia che lo invita a fornire il proprio numero di telefono, quindi chiama PhoneAuthProvider::VerifyPhoneNumber per richiedere a Firebase di inviare un codice di autenticazione al telefono dell'utente tramite SMS:

  1. Recupera il numero di telefono dell'utente.

    I requisiti legali variano ma come best practice e definire aspettative per gli utenti, è bene informarli che, se utilizzano all'accesso con il telefono, potrebbero ricevere un SMS per la verifica si applicano le tariffe.

  2. Chiama PhoneAuthProvider::VerifyPhoneNumber, passandogli il numero di telefono dell'utente.
    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);
    Quando chiami PhoneAuthProvider::VerifyPhoneNumber, Firebase,
    • (su iOS) invia una notifica push silenziosa all'app,
    • invia un SMS contenente un codice di autenticazione all'indirizzo numero di telefono e trasmette un ID di verifica alla tua funzione di completamento. Ti serviranno sia il codice di verifica sia l'ID di verifica per consentire all'utente di eseguire l'accesso.
  3. Salva l'ID verifica e ripristinalo al caricamento dell'app. In questo modo, puoi assicurarti di avere ancora un ID verifica valido se la tua app è terminato prima che l'utente completi il flusso di accesso (ad esempio, passando all'app SMS).

    Puoi mantenere l'ID di verifica in qualsiasi modo. Se stai scrivendo con un framework C++ multipiattaforma, dovrebbe fornire notifiche per l'app la risoluzione e il ripristino. In questi eventi, puoi salvare, ripristinare, rispettivamente l'ID di verifica.

Se la chiamata a VerifyPhoneNumber genera OnCodeSent essere chiamato sul tuo listener, puoi chiedere all'utente di digitare la codice ricevuto nell'SMS.

Se invece la chiamata a VerifyPhoneNumber restituisce OnVerificationCompleted, la verifica automatica è andata a buon fine e ora avrai un PhoneAuthCredential che potrai utilizzare come descritto di seguito.

Effettuare l'accesso dell'utente con il codice di verifica

Dopo che l'utente ha fornito alla tua app il codice di verifica ricevuto nell'SMS messaggio, accedi all'utente creando un PhoneAuthCredential del codice di verifica e dell'ID di verifica e trasmetterlo a Auth::SignInWithCredential.

  1. Ricevi il codice di verifica dall'utente.
  2. Crea un oggetto Credential dal codice di verifica e dall'ID verifica.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Accedi all'utente con l'oggetto 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);

Passaggi successivi

Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni del fornitore di autenticazione, con cui l'utente ha eseguito l'accesso. Questo nuovo viene archiviato come parte del progetto Firebase e può essere utilizzato per identificare a un utente in ogni app del progetto, a prescindere da come esegue l'accesso.

  • Nelle tue app puoi ottenere le informazioni di base del profilo dell'utente dal Oggetto 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();
    }
  • In Firebase Realtime Database e Cloud Storage Regole di sicurezza, puoi ottieni l'ID utente unico dell'utente che ha eseguito l'accesso dalla variabile auth, e usarli per controllare i dati a cui un utente può accedere.

Puoi consentire agli utenti di accedere alla tua app utilizzando più autenticazioni collegando le credenziali del provider di autenticazione a un a un account utente esistente.

Per scollegare un utente, chiama SignOut():

auth->SignOut();