Esegui l'autenticazione con Firebase utilizzando un numero di telefono con Unity

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

  1. Prima di poter utilizzare Firebase Authentication, devi aggiungere l'SDK Firebase Unity (in particolare, FirebaseAuth.unitypackage) al tuo progetto Unity.

    Trova istruzioni dettagliate per questi passaggi di configurazione iniziali in Aggiungere Firebase al progetto Unity project.

  2. Se non hai ancora collegato l'app al progetto Firebase, fallo da console.Firebase
  3. 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é la proprietà di un numero di telefono può essere facilmente trasferita 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 dell'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 progetto Firebase:

  1. Nella console Firebase, vai a Sicurezza > Autenticazione.
  2. Nella scheda Metodo di accesso, attiva il provider di accesso Telefono.
  3. 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.
    1. Nella console Firebase, vai alla scheda Sicurezza > Autenticazione > Impostazioni.
    2. Nella sezione Criterio per la regione SMS, configura il criterio per la regione SMS.

Iniziare a ricevere notifiche APN (solo iOS)

Per utilizzare l'autenticazione con numero di telefono su iOS, 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:

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

    1. Nella console Firebase, vai a Impostazioni > Generali. Quindi, fai clic sulla scheda Cloud Messaging.
    2. Fai clic su Carica certificato per il certificato di sviluppo, il certificato di produzione o entrambi. È necessario almeno uno dei due.
    3. Per ogni certificato, seleziona il file .p12 e fornisci la password, se presente. Assicurati che l'ID pacchetto di questo certificato corrisponda all'ID pacchetto della tua app. Fai clic su Salva.

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:

  1. 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 numero di telefono, potrebbero ricevere un messaggio SMS per la verifica e che si applicano le tariffe standard.

  2. Chiama PhoneAuthProvider.VerifyPhoneNumber, passandogli un oggetto PhoneAuthOptions contenente il numero di telefono dell'utente.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) =&gt {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) =&gt {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    Quando chiami PhoneAuthProvider.VerifyPhoneNumber, Firebase,
    • (su iOS), invia una notifica push silenziosa alla tua app.
    • Firebase invia un messaggio 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.
  3. 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. Un modo semplice è salvare l'ID di verifica con UnityEngine.PlayerPrefs.

Se viene chiamata la richiamata passata a codeSent, puoi chiedere all'utente di digitare il codice di verifica quando lo riceve nel messaggio SMS.

D'altra parte, se viene chiamata la richiamata per verificationCompleted, la verifica automatica è andata a buon fine e ora avrai un oggetto 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 passando tale oggetto a FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync.

  1. Recupera il codice di verifica dall'utente.
  2. Crea un oggetto Credential dal codice di verifica e dall'ID di verifica.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. Consenti all'utente di accedere con l'oggetto PhoneAuthCredential:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task =&gt {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });

Passaggi successivi

Quando un utente accede per la prima volta, viene creato un nuovo account utente e collegato alle credenziali con cui ha eseguito l'accesso, ovvero nome utente e password, numero di telefono o informazioni del provider di autenticazione. Questo nuovo account viene memorizzato come parte del progetto Firebase e può essere utilizzato per identificare un utente in ogni app del progetto, indipendentemente dalla modalità di accesso.

  • Nelle tue app, puoi ottenere le informazioni di base del profilo dell'utente dall'oggetto Firebase.Auth.FirebaseUser:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
  • 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.

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();