Best practice per l'utilizzo di signInWithRedirect sui browser che bloccano l'accesso allo spazio di archiviazione di terze parti

Questo documento descrive le best practice per l'utilizzo degli accessi con reindirizzamento sui browser che bloccano i cookie di terze parti. Devi seguire una delle opzioni elencate qui per far funzionare signInWithRedirect() come previsto negli ambienti di produzione, in tutti i browser.

Panoramica

Per rendere il flusso di signInWithRedirect() fluido per te e i tuoi utenti, l'SDK JavaScript di Firebase Authentication utilizza un iframe multiorigine che si connette al dominio Firebase Hosting della tua app. Tuttavia, questo meccanismo non funziona con i browser che bloccano l'accesso allo spazio di archiviazione di terze parti.

Poiché chiedere agli utenti di disattivare le funzionalità di partizionamento dell'archiviazione nel browser è raramente un'opzione, devi invece applicare una delle seguenti opzioni di configurazione alla tua app, a seconda delle specifiche del tuo caso d'uso.

  • Se ospiti la tua app con Firebase Hosting su un sottodominio di firebaseapp.com, questo problema non ti riguarda e non è necessario intervenire.
  • Se ospiti la tua app con Firebase Hosting su un dominio personalizzato o un sottodominio di web.app, utilizza l'opzione 1.
  • Se ospiti la tua app con un servizio diverso da Firebase, utilizza l'opzione 2, l'opzione 3, l'opzione 4, o l'opzione 5.

Opzione 1: aggiorna la configurazione di Firebase per utilizzare il tuo dominio personalizzato come authDomain

Se ospiti la tua app con Firebase Hosting utilizzando un dominio personalizzato, puoi configurare l'SDK Firebase in modo che utilizzi il tuo dominio personalizzato come authDomain. In questo modo l'app e l'iframe di autenticazione utilizzano lo stesso dominio, il che impedisce il problema di accesso. Se non utilizzi Firebase Hosting, devi utilizzare un'altra opzione. Assicurati di aver configurato il dominio personalizzato nello stesso progetto che utilizzi per l'autenticazione.

Per aggiornare la configurazione di Firebase in modo da utilizzare il tuo dominio personalizzato come dominio di autenticazione, procedi nel seguente modo:

  1. Configura l'SDK Firebase JS in modo che utilizzi il tuo dominio personalizzato come authDomain:

    const firebaseConfig = {
      apiKey: "<api-key>",
      authDomain: "<the-domain-that-serves-your-app>",
      databaseURL: "<database-url>",
      projectId: "<project-id>",
      appId: "<app-id>"
    };
    
  1. Aggiungi il nuovo authDomain all'elenco degli URI di reindirizzamento autorizzati del tuo provider OAuth. La procedura varia a seconda del fornitore, ma in generale puoi seguire la sezione "Prima di iniziare" di qualsiasi fornitore per istruzioni esatte (ad esempio, il fornitore Facebook). L'URI aggiornato per l'autorizzazione è https://<the-domain-that-serves-your-app>/__/auth/handler. Il carattere /__/auth/handler alla fine è importante.

    Allo stesso modo, se utilizzi un provider SAML, aggiungi il nuovo authDomain all'URL ACS (Assertion Consumer Service) SAML.

  2. Assicurati che il tuo continue_uri sia presente nell'elenco dei domini autorizzati.

  3. Esegui di nuovo il deployment con Firebase Hosting, se necessario, per recuperare il file di configurazione Firebase più aggiornato ospitato all'indirizzo /__/firebase/init.json.

Opzione 2: passa a signInWithPopup()

Utilizza signInWithPopup() al posto di signInWithRedirect(). Il resto del codice dell'app rimane invariato, ma l'oggetto UserCredential viene recuperato in modo diverso.

Versione web 9

  // Before
  // ==============
  signInWithRedirect(auth, new GoogleAuthProvider());
  // After the page redirects back
  const userCred = await getRedirectResult(auth);

  // After
  // ==============
  const userCred = await signInWithPopup(auth, new GoogleAuthProvider());

Versione web 8

  // Before
  // ==============
  firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
  // After the page redirects back
  var userCred = await firebase.auth().getRedirectResult();

  // After
  // ==============
  var userCred = await firebase.auth().signInWithPopup(
      new firebase.auth.GoogleAuthProvider());
```

L'accesso tramite popup non è sempre ideale per gli utenti: i popup vengono occasionalmente bloccati dal dispositivo o dalla piattaforma e il flusso è meno fluido per gli utenti di dispositivi mobili. Se l'utilizzo dei popup è un problema per la tua app, dovrai seguire una delle altre opzioni.

Opzione 3: Richieste di autenticazione proxy a firebaseapp.com

Il flusso signInWithRedirect inizia con il reindirizzamento dal dominio dell'app al dominio specificato nel parametro authDomain nella configurazione di Firebase (".firebaseapp.com" per impostazione predefinita). authDomain ospita il codice dell'helper di accesso che reindirizza al provider di identità, il quale, in caso di esito positivo, reindirizza di nuovo al dominio dell'app.

Quando il flusso di autenticazione torna al dominio dell'app, viene eseguito l'accesso allo spazio di archiviazione del browser del dominio dell'helper di accesso. Questa opzione e quella successiva (per l'hosting autonomo del codice) eliminano l'accesso all'archiviazione multiorigine, che altrimenti viene bloccato dai browser.

  1. Configura un proxy inverso sul server delle app in modo che le richieste GET/POST a https://<app domain>/__/auth/ vengano inoltrate a https://<project>.firebaseapp.com/__/auth/. Assicurati che questo inoltro sia trasparente per il browser. Non è possibile farlo tramite un reindirizzamento 302.

    Se utilizzi nginx per pubblicare il tuo dominio personalizzato, la configurazione del proxy inverso sarà simile a questa:

    # reverse proxy for signin-helpers for popup/redirect sign in.
    location /__/auth {
      proxy_pass https://<project>.firebaseapp.com;
    }
    
  2. Segui i passaggi descritti nell'opzione 1 per aggiornare redirect_uri, l'URL ACS e authDomain autorizzati. Una volta eseguito di nuovo il deployment dell'app, l'accesso multiorigine allo spazio di archiviazione non dovrebbe più verificarsi.

Opzione 4: ospita autonomamente il codice dell'helper per l'accesso nel tuo dominio

Un altro modo per eliminare l'accesso all'archiviazione multiorigine è l'hosting autonomo del codice helper di accesso Firebase. Tuttavia, questo approccio non funziona per l'accesso con Apple o SAML. Utilizza questa opzione solo se la configurazione del proxy inverso dell'opzione 3 non è fattibile.

L'hosting del codice helper prevede i seguenti passaggi:

  1. Scarica i file da ospitare dalla posizione <project>.firebaseapp.com eseguendo questi comandi:

    mkdir signin_helpers/ && cd signin_helpers
    wget https://<project>.firebaseapp.com/__/auth/handler
    wget https://<project>.firebaseapp.com/__/auth/handler.js
    wget https://<project>.firebaseapp.com/__/auth/experiments.js
    wget https://<project>.firebaseapp.com/__/auth/iframe
    wget https://<project>.firebaseapp.com/__/auth/iframe.js
    wget https://<project>.firebaseapp.com/__/auth/links
    wget https://<project>.firebaseapp.com/__/auth/links.js
    wget https://<project>.firebaseapp.com/__/firebase/init.json
    
  2. Ospita i file sopra indicati nel dominio dell'app. Assicurati che il tuo server web possa rispondere a https://<app domain>/__/auth/<filename> e https://<app domain>/__/firebase/init.json.

    Ecco un'implementazione del server di esempio che scarica e ospita i file. Ti consigliamo di scaricare e sincronizzare periodicamente i file per assicurarti di ricevere le correzioni di bug e le funzionalità più recenti.

  3. Segui i passaggi descritti nell'opzione 1 per aggiornare l'redirect_uri autorizzato e il tuo authDomain. Una volta eseguito di nuovo il deployment dell'app, l'accesso multiorigine allo spazio di archiviazione non dovrebbe più verificarsi.

Opzione 5: gestisci l'accesso del fornitore in modo indipendente

L'SDK Firebase Authentication fornisce signInWithPopup() e signInWithRedirect() come metodi pratici per racchiudere logiche complicate ed evitare la necessità di coinvolgere un altro SDK. Puoi evitare di utilizzare entrambi i metodi accedendo in modo indipendente al tuo provider, quindi utilizzando signInWithCredential() per scambiare le credenziali del provider con una credenziale di Firebase Authentication. Ad esempio, puoi utilizzare l'SDK Accedi con Google, il codice campione per ottenere una credenziale dell'Account Google, quindi creare un'istanza di una nuova credenziale Google eseguendo il seguente codice:

Versione web 9

  // `googleUser` from the onsuccess Google Sign In callback.
  //  googUser = gapi.auth2.getAuthInstance().currentUser.get();
  const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
  const result = await signInWithCredential(auth, credential);

Versione web 8

  // `googleUser` from the onsuccess Google Sign In callback.
  const credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token);
  const result = await firebase.auth().signInWithCredential(credential);

Dopo aver chiamato signInWithCredential(), il resto delle funzioni dell'app funziona come prima.

Le istruzioni per ottenere una credenziale Apple sono disponibili qui.