查看 2022 年 Google I/O 大会上介绍的 Firebase 新动态。了解详情

Autenticati con Firebase utilizzando un numero di telefono e C++

Puoi utilizzare l'autenticazione Firebase per accedere a un utente inviando 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 a un numero di telefono utilizzando Firebase SDK.

Prima di iniziare

  1. Aggiungi Firebase al tuo progetto C++ .
  2. Se non hai ancora collegato la tua app al tuo progetto Firebase, fallo dalla console Firebase .

Sulle piattaforme Apple, tieni presente che l'accesso con il numero di telefono richiede un dispositivo fisico e non funzionerà su un simulatore.

Problemi di sicurezza

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

Se utilizzi l'accesso basato sul numero di telefono nella tua app, dovresti offrirlo insieme a metodi di accesso più sicuri e informare gli utenti dei compromessi di sicurezza dell'utilizzo dell'accesso tramite numero di telefono.

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

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

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

La quota di richieste di accesso al numero di telefono di Firebase è sufficientemente alta da non influire sulla maggior parte delle app. Tuttavia, se è necessario accedere a un volume molto elevato di utenti con l'autenticazione del telefono, potrebbe essere necessario aggiornare il piano tariffario. Vedi la pagina dei prezzi .

Inizia a ricevere notifiche APN (piattaforme Apple)

Per utilizzare l'autenticazione del numero di telefono sulle piattaforme Apple, la tua app deve essere in grado di ricevere le notifiche APN da Firebase. Quando accedi per la prima volta a un utente con il suo numero di telefono su un dispositivo, Firebase Authentication invia una notifica push silenziosa al dispositivo per verificare che la richiesta di accesso al numero di telefono provenga dalla tua app. (Per questo motivo, l'accesso al numero di telefono non può essere utilizzato su un simulatore.)

Per abilitare le notifiche APN da utilizzare con l'autenticazione Firebase:

  1. In Xcode, abilita le notifiche push per il tuo progetto.
  2. Carica il tuo certificato APN su Firebase. Se non disponi già di un certificato APNs, assicurati di crearne uno nell'Apple Developer Member Center .

    1. All'interno del tuo progetto nella console Firebase, seleziona l'icona a forma di ingranaggio, seleziona Impostazioni progetto e quindi seleziona la scheda Messaggistica cloud .

    2. Seleziona il pulsante Carica certificato per il tuo certificato di sviluppo, il tuo certificato di produzione o entrambi. Almeno uno è richiesto.

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

Invia un codice di verifica al telefono dell'utente

Per avviare l'accesso con il numero di telefono, presenta all'utente un'interfaccia che richiede loro di 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. Ottieni il numero di telefono dell'utente.

    I requisiti legali variano, ma come procedura consigliata e per definire le aspettative per i tuoi utenti, dovresti informarli che se utilizzano l'accesso tramite telefono, potrebbero ricevere un messaggio SMS per la verifica e applicare tariffe standard.

  2. Chiama PhoneAuthProvider::VerifyPhoneNumber , passandogli il numero di telefono dell'utente.
    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);
    
    Quando si chiama PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (su iOS) invia una notifica push silenziosa alla tua app,
    • invia un messaggio SMS contenente un codice di autenticazione al numero di telefono specificato e trasmette un ID di verifica alla funzione di completamento. Avrai bisogno sia del codice di verifica che dell'ID di verifica per accedere all'utente.
  3. Salva l'ID di verifica e ripristinalo al caricamento dell'app. In questo modo, puoi assicurarti di avere ancora un ID di verifica valido se la tua app viene chiusa prima che l'utente completi il ​​flusso di accesso (ad esempio, mentre passa all'app SMS).

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

Se la chiamata a VerifyPhoneNumber comporta la chiamata di OnCodeSent sul Listener, è possibile richiedere all'utente di digitare il codice di verifica quando lo riceve nel messaggio SMS.

D'altra parte, se la chiamata a VerifyPhoneNumber risulta in OnVerificationCompleted , la verifica automatica è riuscita e ora avrai una Credential con la quale puoi utilizzare come descritto di seguito.

Accedi l'utente con il codice di verifica

Dopo che l'utente ha fornito all'app il codice di verifica dal messaggio SMS, accedi all'utente creando un oggetto Credential dal codice di verifica e dall'ID di verifica e passando quell'oggetto a Auth::SignInWithCredential .

  1. Ottieni il codice di verifica dall'utente.
  2. Crea un oggetto Credential dal codice di verifica e dall'ID di verifica.
    Credential 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.
            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);
    

Prossimi passi

Dopo che un utente accede per la prima volta, un nuovo account utente viene creato e collegato alle credenziali, ovvero il nome utente e la password, il numero di telefono o le informazioni sul provider di autenticazione, con cui l'utente ha effettuato l'accesso. Questo nuovo account viene archiviato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto, indipendentemente da come l'utente effettua l'accesso.

  • Nelle tue app, puoi ottenere le informazioni del profilo di base dell'utente dall'oggetto 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();
    }
    
  • Nelle regole di sicurezza del database in tempo reale e dell'archiviazione cloud di Firebase, puoi ottenere l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile auth e utilizzarlo per controllare a quali dati può accedere un utente.

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

Per disconnettere un utente, chiama SignOut() :

auth->SignOut();