Autenticati con Firebase utilizzando un numero di telefono con Unity

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 tramite numero di telefono utilizzando l'SDK Firebase.

Prima di iniziare

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

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

  2. Se non hai ancora collegato la tua app al tuo progetto Firebase, fallo dalla console Firebase .
  3. Comprendere i requisiti della piattaforma per l'accesso tramite numero di telefono:
    • L'accesso tramite numero di telefono è disponibile solo per le piattaforme mobili.
    • 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 conveniente, è meno sicura rispetto agli altri metodi disponibili, perché 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 in termini di sicurezza derivanti dall'utilizzo dell'accesso tramite numero di telefono.

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

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

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

La quota delle richieste di accesso tramite numero di telefono di Firebase è sufficientemente elevata da non influire sulla maggior parte delle app. Tuttavia, se devi far accedere un volume molto elevato di utenti con l'autenticazione telefonica, potrebbe essere necessario aggiornare il tuo piano tariffario. Consulta la pagina dei prezzi .

Inizia a ricevere notifiche APN (solo iOS)

Per utilizzare l'autenticazione del numero di telefono su iOS, la tua app deve essere in grado di ricevere 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 con il numero di telefono provenga dalla tua app. (Per questo motivo, l'accesso tramite 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 APN, 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. Ne è richiesto almeno uno.

    3. Per ciascun 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 tramite numero di telefono, presenta all'utente un'interfaccia che gli chiede di 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:

  1. Ottieni il numero di telefono dell'utente.

    I requisiti legali variano, ma come best practice e per definire le aspettative dei tuoi utenti, dovresti informarli che se utilizzano l'accesso tramite telefono, potrebbero ricevere un messaggio SMS per la verifica e si applicano le tariffe standard.

  2. Chiama PhoneAuthProvider.VerifyPhoneNumber , passandogli un 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) => {
        // 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) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // 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) => {
        // 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 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 quando viene caricata l'app. In questo modo, puoi assicurarti di avere ancora un ID di verifica valido se la tua app viene terminata prima che l'utente completi il ​​flusso di accesso (ad esempio, mentre passa all'app SMS).

    Puoi rendere persistente l'ID di verifica nel modo che preferisci. Un modo semplice è salvare l'ID di verifica con UnityEngine.PlayerPrefs .

Se viene richiamata la richiamata passata a codeSent , è possibile richiedere 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 è riuscita e ora avrai un PhoneAuthCredential con cui puoi utilizzare come descritto di seguito.

Accedi all'utente con il codice di verifica

Dopo che l'utente ha fornito alla tua app il codice di verifica dal messaggio SMS, accedi creando un oggetto PhoneAuthCredential dal codice di verifica e dall'ID di verifica e passando tale oggetto a FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync .

  1. Ottieni 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. Accedi all'utente con l'oggetto PhoneAuthCredential :
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      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);
    });
    

Prossimi passi

Dopo che un utente accede per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o 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 dalla modalità di accesso dell'utente.

  • 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;
    }
    
  • Nel tuo Firebase Realtime Database e Cloud Storage Security Rules , puoi ottenere l'ID utente univoco dell'utente che ha effettuato 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();