Puoi utilizzare Firebase Authentication per far accedere un utente inviando un 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++.
- Se non hai ancora collegato la tua app al progetto Firebase, fallo dalla console Firebase.
- Comprendi i requisiti della piattaforma per l'accesso con numero di telefono:
- L'accesso con numero di telefono è disponibile 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 sia 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 SMS può accedere a un account utilizzando il numero di telefono del dispositivo.
Se nella tua app utilizzi l'accesso basato sul numero di telefono, devi offrirlo insieme a metodi di accesso più sicuri e informare gli utenti dei compromessi in termini di sicurezza legati all'utilizzo dell'accesso con il numero di telefono.
Attiva l'accesso con numero di telefono per il tuo progetto Firebase
Per consentire agli utenti di accedere tramite SMS, devi prima attivare 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, attiva il provider di accesso Telefono.
-
Imposta una policy sulle regioni in cui vuoi consentire o negare l'invio di SMS. L'impostazione di una policy per le regioni SMS può contribuire a proteggere le tue app da abusi tramite SMS. Per i nuovi progetti, la policy predefinita non consente alcuna regione.
- Nella console Firebase, vai alla scheda Sicurezza > Autenticazione > Impostazioni.
- Nella sezione Policy regione SMS, configura la policy regione SMS.
Inizia a ricevere notifiche APN (piattaforme Apple)
Per utilizzare l'autenticazione tramite numero di telefono sulle piattaforme Apple, la tua app deve essere in grado di ricevere notifiche APN da Firebase. Quando un utente accede per la prima volta con il proprio numero di telefono su un dispositivo, Firebase Authentication invia una notifica push silenziosa al dispositivo per verificare che la richiesta di accesso con il numero di telefono provenga dalla tua app. Per questo motivo, l'accesso con il numero di telefono non può essere utilizzato su un simulatore.
Per attivare le notifiche APN da utilizzare con Firebase Authentication:
- In Xcode, attiva le notifiche push per il tuo progetto.
Carica il certificato APN su Firebase. Se non hai ancora un certificato APN, assicurati di crearne uno nell'Apple Developer Member Center.
-
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. È obbligatorio indicarne almeno uno.
-
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
Invia un codice di verifica al telefono dell'utente
Per avviare l'accesso con il numero di telefono, presenta all'utente un'interfaccia che lo invita a fornire il proprio numero di telefono, quindi chiama PhoneAuthProvider::VerifyPhoneNumber per richiedere che Firebase invii un codice di autenticazione al telefono dell'utente tramite SMS:
-
Recuperare il numero di telefono dell'utente.
I requisiti legali variano, ma come best practice e per definire le aspettative degli utenti, devi informarli che se utilizzano l'accesso tramite telefono, potrebbero ricevere un SMS per la verifica e che si applicano le tariffe standard.
- Chiama
PhoneAuthProvider::VerifyPhoneNumber, passando 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). // There's no need for the end user to input the verification code manually. // `credential` can't 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 SMS contenente un codice di autenticazione al numero di telefono specificato e passa un ID di verifica alla funzione di completamento. Per consentire all'utente di accedere, avrai bisogno sia del codice di verifica sia dell'ID di verifica.
-
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 l'app viene terminata prima che l'utente completi il flusso di accesso (ad esempio, durante il passaggio all'app per SMS).
Puoi rendere persistente l'ID di verifica come preferisci. Se scrivi con un framework C++ multipiattaforma, questo dovrebbe fornire notifiche per la chiusura 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.
Se invece la chiamata a VerifyPhoneNumber restituisce
OnVerificationCompleted, la verifica automatica è andata a buon fine
e ora avrai un PhoneAuthCredential che puoi utilizzare come descritto
di seguito.
Esegui l'accesso dell'utente con il codice di verifica
Dopo che l'utente ha fornito alla tua app il codice di verifica del messaggio SMS, esegui l'accesso dell'utente creando un oggetto PhoneAuthCredential dal codice di verifica e dall'ID di verifica e passando l'oggetto a Auth::SignInWithCredential.
- Chiedi all'utente il codice di verifica.
- 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 l'accesso 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 il primo accesso di un utente, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni del provider di autenticazione, con cui l'utente ha eseguito 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 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
authe utilizzarlo per controllare i dati a cui un utente può accedere.
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();