Puoi utilizzare Firebase Authentication per consentire a un utente di accedere inviando un messaggio SMS al suo telefono. L'utente accede utilizzando un codice monouso contenuto nel messaggio SMS.
Questo documento descrive come implementare un flusso di accesso con numero di telefono utilizzando l'SDK Firebase.
Prima di iniziare
- Aggiungi Firebase al tuo progetto C++ project.
- Se non hai ancora collegato l'app al tuo progetto Firebase, fallo da consoleFirebase.
- Comprendi i requisiti della piattaforma per l'accesso con numero di telefono:
- L'accesso con numero di telefono è solo per le piattaforme mobile.
- Su iOS, l'accesso con numero di telefono richiede un dispositivo fisico e non funziona su un simulatore.
Problemi di sicurezza
L'autenticazione che utilizza solo un numero di telefono, sebbene comoda, è meno sicura rispetto agli altri metodi disponibili, perché il possesso di un numero di telefono può essere facilmente trasferito tra gli utenti. Inoltre, sui dispositivi con più profili utente, qualsiasi utente che può 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 derivanti dall'utilizzo dell'accesso con numero di telefono.
Abilitare l'accesso con numero di telefono per il progetto Firebase
Per consentire agli utenti di accedere tramite SMS, devi prima abilitare il metodo di accesso con numero di telefono per il tuo progetto Firebase:
- Nella console Firebase, vai a Sicurezza > Autenticazione.
- Nella scheda Metodo di accesso, abilita il provider di accesso Telefono.
-
Imposta un criterio per le regioni a cui vuoi consentire o negare
l'invio di messaggi SMS. L'impostazione di un criterio per la regione SMS può contribuire a proteggere le tue
app da utilizzi illeciti degli SMS. Per i nuovi progetti, il criterio predefinito non consente regioni.
- Nella console Firebase, vai alla scheda Sicurezza > Autenticazione > Impostazioni.
- Nella sezione Policy regione SMS, configura la policy regione SMS.
Iniziare a ricevere notifiche APN (piattaforme Apple)
Per utilizzare l'autenticazione con numero di telefono sulle piattaforme Apple, la tua app deve essere in grado di ricevere notifiche APN da Firebase. Quando un utente accede con il suo numero di telefono per la prima volta su un dispositivo, Firebase Authentication invia una notifica push silenziosa al dispositivo per verificare che la richiesta di accesso con numero di telefono provenga dalla tua app. Per questo motivo, l'accesso con numero di telefono non può essere utilizzato su un simulatore.
Per abilitare le notifiche APN per l'utilizzo con Firebase Authentication:
- In Xcode, abilita le notifiche push per il tuo progetto.
Carica il certificato APN su Firebase. Se non hai già un certificato APN, assicurati di crearne uno nel Centro membri Apple Developer.
-
Nella console Firebase, vai a
Impostazioni > Generali. Poi, fai clic sulla scheda Cloud Messaging. - Fai clic su Carica certificato per il certificato di sviluppo, il certificato di produzione o entrambi. È necessario almeno uno dei due.
-
Per ogni certificato, seleziona il file
.p12e fornisci la password, se presente. Assicurati che l'ID pacchetto di questo certificato corrisponda all'ID pacchetto della tua app. Fai clic su Salva.
-
Nella console Firebase, vai a
Inviare un codice di verifica al telefono dell'utente
Per avviare l'accesso con numero di telefono, presenta all'utente un'interfaccia che gli chiede
di fornire il suo numero di telefono, quindi chiama
PhoneAuthProvider::VerifyPhoneNumber per richiedere a Firebase di inviare un
codice di autenticazione al telefono dell'utente tramite SMS:
-
Recupera il numero di telefono dell'utente.
I requisiti legali variano, ma come best practice e per impostare le aspettative degli utenti, dovresti informarli che se utilizzano l'accesso con il telefono, potrebbero ricevere un messaggio SMS per la verifica e che si applicano le tariffe standard.
- Chiama
PhoneAuthProvider::VerifyPhoneNumber, passandogli il numero di telefono dell'utente. Quando chiamiclass 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);
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 passa un ID di verifica alla funzione di completamento. Avrai bisogno sia del codice di verifica sia dell'ID di verifica per consentire all'utente di accedere.
-
Salva l'ID di verifica e ripristinalo quando l'app viene caricata. In questo modo, puoi assicurarti di avere ancora un ID di verifica valido se l'app viene terminata prima che l'utente completi il flusso di accesso (ad esempio, quando passa all'app per SMS).
Puoi rendere persistente l'ID di verifica in qualsiasi modo. Se scrivi con un framework C++ multipiattaforma, questo dovrebbe fornire notifiche per la terminazione e il ripristino dell'app. In questi eventi, puoi salvare e ripristinare, rispettivamente, l'ID di verifica.
Se la chiamata a VerifyPhoneNumber comporta la chiamata di OnCodeSent sul tuo listener, puoi chiedere all'utente di digitare il codice di verifica quando lo riceve nel messaggio SMS.
D'altra parte, se la chiamata a VerifyPhoneNumber comporta OnVerificationCompleted, la verifica automatica è riuscita e ora avrai un PhoneAuthCredential che potrai utilizzare come descritto di seguito.
Consentire all'utente di accedere con il codice di verifica
Dopo che l'utente ha fornito alla tua app il codice di verifica dal messaggio SMS, consenti all'utente di accedere creando un oggetto PhoneAuthCredential
dal codice di verifica e dall'ID di verifica e passandolo a Auth::SignInWithCredential.
- Recupera il codice di verifica dall'utente.
- Crea un oggetto
Credentialdal codice di verifica e dall'ID di verifica.PhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- Consenti all'utente di accedere 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 accede per la prima volta, viene creato un nuovo account utente e collegato alle credenziali con cui l'utente ha eseguito l'accesso, ovvero nome utente e password, numero di telefono o informazioni del provider di autenticazione. 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 dalla modalità di accesso dell'utente.
-
Nelle tue app, puoi ottenere le informazioni di base del profilo dell'utente dall'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(); }
Nelle regole di sicurezza di Firebase Realtime Database e Cloud Storage , puoi ottenere l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile
auth, e utilizzarlo per controllare i dati a cui un utente può accedere.
Per disconnettere un utente, chiama
SignOut():
auth->SignOut();