Codelab web su App Check

1. Introduzione

Ultimo aggiornamento: 23/02/2023

Come faccio a impedire l'accesso non autorizzato alle mie risorse Firebase?

Puoi utilizzare Firebase App Check per impedire ai client non autorizzati di accedere alle tue risorse di backend richiedendo che le richieste in arrivo siano allegate a un'attestazione che confermi che la richiesta proviene dalla tua app autentica e bloccando il traffico che non dispone di un'attestazione adeguata. Firebase App Check si basa su fornitori di attestazioni specifici della piattaforma per verificare l'autenticità del client: per le app web, App Check supporta reCAPTCHA v3 e reCAPTCHA Enterprise come fornitori di attestazioni.

App Check può essere utilizzato per proteggere le richieste a Cloud Firestore, Realtime Database, Cloud Functions, Firebase Authentication con Identity Platform e sui backend che ospiti autonomamente.

Cosa creerai

In questo codelab, proteggerai un'applicazione di chat aggiungendo e poi applicando App Check.

L'app di chat facile da usare creata da te.

Cosa imparerai a fare

  • Come monitorare il backend per rilevare accessi non autorizzati
  • Come applicare l'applicazione a Firestore e Cloud Storage
  • Come eseguire l'applicazione con un token di debug per lo sviluppo locale

Che cosa ti serve

  • L'IDE/l'editor di testo che preferisci
  • Il gestore dei pacchetti npm, che in genere è incluso in Node.js
  • L'interfaccia a riga di comando di Firebase installata e configurata per funzionare con il tuo account
  • Un terminale/una console
  • Un browser a tua scelta, ad esempio Chrome
  • Il codice di esempio del codelab (vedi il passaggio successivo del codelab per scoprire come ottenere il codice).

2. recupera il codice campione

Clona il repository GitHub del codelab dalla riga di comando:

git clone https://github.com/firebase/codelab-friendlychat-web

In alternativa, se non hai installato Git, puoi scaricare il repository come file ZIP.

Importare l'app iniziale

Utilizzando l'IDE, apri o importa la directory 📁 appcheck-start dal repository clonato. Questa directory 📁 appcheck-start contiene il codice iniziale del codelab, che sarà un'app web di chat completamente funzionale. La directory 📁 appcheck-start conterrà il codice completo del codelab.appcheck

3. Crea e configura un progetto Firebase

Crea un progetto Firebase

  1. Accedi a Firebase.
  2. Nella console Firebase, fai clic su Aggiungi progetto e poi assegna il nome FriendlyChat al progetto Firebase. Ricorda l'ID progetto per il tuo progetto Firebase.
  3. Deseleziona Abilita Google Analytics per questo progetto
  4. Fai clic su Crea progetto.

L'applicazione che stiamo per creare utilizza i prodotti Firebase disponibili per le app web:

  • Firebase Authentication per consentire facilmente agli utenti di accedere alla tua app.
  • Cloud Firestore per salvare i dati strutturati sul cloud e ricevere una notifica immediata quando i dati cambiano.
  • Cloud Storage for Firebase per salvare i file nel cloud.
  • Firebase Hosting per ospitare e pubblicare gli asset.
  • Firebase Cloud Messaging per inviare notifiche push e visualizzare notifiche popup del browser.
  • Firebase Performance Monitoring per raccogliere i dati sul rendimento degli utenti per la tua app.

Alcuni di questi prodotti richiedono una configurazione speciale o devono essere attivati utilizzando la console Firebase.

Eseguire l'upgrade del piano tariffario di Firebase

Per utilizzare Cloud Storage for Firebase, il progetto Firebase deve utilizzare il piano tariffario Blaze (pagamento a consumo), il che significa che deve essere collegato a un account di fatturazione Cloud.

  • Un account di fatturazione Cloud richiede un metodo di pagamento, ad esempio una carta di credito.
  • Se non hai mai utilizzato Firebase e Google Cloud, controlla se hai l'idoneità a ricevere un credito di 300$e un account di fatturazione Cloud per la prova senza costi.
  • Se stai svolgendo questo codelab nell'ambito di un evento, chiedi all'organizzatore se sono disponibili crediti Cloud.

Per eseguire l'upgrade del progetto al piano Blaze:

  1. Nella console Firebase, seleziona l'upgrade del piano.
  2. Seleziona il piano Blaze. Segui le istruzioni sullo schermo per collegare un account di fatturazione Cloud al tuo progetto.
    Se hai dovuto creare un account di fatturazione Cloud nell'ambito di questo upgrade, potresti dover tornare al flusso di upgrade nella console Firebase per completarlo.

Aggiungi un'app web Firebase al progetto

  1. Fai clic sull'icona web 58d6543a156e56f9.png per creare una nuova app web Firebase.
  2. Registra l'app con il nickname Chat amichevole, quindi seleziona la casella accanto a Configura anche Firebase Hosting per questa app. Fai clic su Registra app.
  3. Nel passaggio successivo, vedrai un comando per installare Firebase utilizzando npm e un oggetto di configurazione. Copia questo oggetto in un secondo momento nel codelab, quindi per il momento premi Avanti.

La finestra per aggiungere Firebase alla tua applicazione web

  1. Vedrai un'opzione per installare l'interfaccia a riga di comando di Firebase. Se non l'hai ancora installato, fallo ora utilizzando il comando npm install -g firebase-tools. Fai quindi clic su Avanti.
  2. Viene visualizzata un'opzione per accedere a Firebase ed eseguire il deployment in Firebase Hosting. Accedi a Firebase utilizzando il comando firebase login, quindi fai clic su Continua alla console. Eseguirai il deployment in Firebase Hosting in un passaggio successivo.

Attivare Accedi con Google per Firebase Authentication

Per consentire agli utenti di accedere all'app web con i propri Account Google, utilizzeremo il metodo di accesso Google.

Dovrai attivare Accedi con Google:

  1. Nella console Firebase, individua la sezione Build nel riquadro a sinistra.
  2. Fai clic su Autenticazione, poi su Inizia, se applicabile, quindi sulla scheda Metodo di accesso (o fai clic qui per andare direttamente a questa pagina).
  3. Attivare il provider di Accedi con Google
  4. Imposta il nome visibile al pubblico della tua app su Chat amichevole e scegli un'email di assistenza del progetto dal menu a discesa.
  5. Fai clic su Salva

f96888973c3d00cc.png

Configura Cloud Firestore

L'app web utilizza Cloud Firestore per salvare i messaggi della chat e ricevere nuovi messaggi.

Ecco come configurare Cloud Firestore nel tuo progetto Firebase:

  1. Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Database Firestore.
  2. Fai clic su Crea database.
  3. Lascia l'ID database impostato su (default).
  4. Seleziona una posizione per il database, poi fai clic su Avanti.
    Per un'app reale, scegli una posizione vicina ai tuoi utenti.
  5. Fai clic su Avvia in modalità di test. Leggi il disclaimer relativo alle regole di sicurezza.
    Più avanti in questo codelab, aggiungerai le regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre pubblicamente un'app senza aggiungere regole di sicurezza per il tuo database.
  6. Fai clic su Crea.

Configurare Cloud Storage for Firebase

L'app web utilizza Cloud Storage per Firebase per archiviare, caricare e condividere le foto.

Ecco come configurare Cloud Storage for Firebase nel tuo progetto Firebase:

  1. Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Archiviazione.
  2. Fai clic su Inizia.
  3. Seleziona una posizione per il bucket di archiviazione predefinito.
    I bucket in US-WEST1, US-CENTRAL1 e US-EAST1 possono usufruire del livello"Sempre senza costi" per Google Cloud Storage. I bucket in tutte le altre località rispettano i prezzi e l'utilizzo di Google Cloud Storage.
  4. Fai clic su Avvia in modalità di test. Leggi il disclaimer relativo alle regole di sicurezza.
    Più avanti in questo codelab, aggiungerai regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre un'app pubblicamente senza aggiungere regole di sicurezza per il bucket di archiviazione.
  5. Fai clic su Crea.

4. Configura Firebase

Dalla directory appcheck-start, chiama:

firebase use --add

Quando richiesto, seleziona il tuo ID progetto e poi assegna un alias al progetto Firebase. Per questo progetto, puoi semplicemente assegnare un alias di default. Successivamente, dovrai configurare il progetto locale per il funzionamento con Firebase.

  1. Vai alle impostazioni del progetto nella Console Firebase.
  2. Nella scheda "Le tue app", seleziona il nickname dell'app per cui hai bisogno di un oggetto di configurazione.
  3. Seleziona Configurazione dal riquadro dello snippet dell'SDK Firebase.
  4. Copia lo snippet dell'oggetto di configurazione e aggiungilo a appcheck-start/hosting/src/firebase-config.js. Il resto del codelab presuppone che la variabile sia denominata config.

firebase-config.js

const config = {
  apiKey: "API_KEY",
  authDomain: "PROJECT_ID.firebaseapp.com",
  databaseURL: "https://PROJECT_ID.firebaseio.com",
  projectId: "PROJECT_ID",
  storageBucket: "PROJECT_ID.firebasestorage.app",
  messagingSenderId: "SENDER_ID",
  appId: "APP_ID",
  measurementId: "G-MEASUREMENT_ID",
};

Dalla stessa directory appcheck-start, chiama:

firebase experiments:enable webframeworks

In questo modo viene attivato il supporto del framework web con cui è stato creato il progetto.

Ora è tutto pronto per eseguire il progetto e verificare che funzioni.

5. Provare l'app senza App Check

Ora che hai configurato l'app e l'SDK, prova a utilizzarla come progettata originariamente. Innanzitutto, installa tutte le dipendenze. Dal terminale, vai alla directory appcheck-start/hosting. All'interno della directory, esegui npm install. Vengono recuperate tutte le dipendenze necessarie per il funzionamento del progetto. Per avviare l'app nel suo stato corrente, puoi eseguire firebase serve. L'app ti chiede di accedere con un Account Google. Effettua l'accesso e prova a pubblicare alcuni messaggi e foto nella chat.

Ora che l'hai testato localmente, è il momento di vederlo in produzione. Esegui firebase deploy per eseguire il deployment dell'applicazione web sul web. Questa parte è un passaggio fondamentale per dimostrare il funzionamento di App Check nella realtà, in quanto richiede la configurazione di un dominio per il provider di attestazione reCAPTCHA Enterprise.

Speriamo che tu stia utilizzando la funzionalità predefinita fornita dall'app. Pubblicare messaggi di chat e tutto ciò che deve essere fatto solo da un'app come questa. Lo svantaggio dello stato attuale è che chiunque abbia la configurazione dell'app del passaggio precedente può accedere alle risorse di backend. Devono comunque rispettare le regole di sicurezza in vigore nei sistemi Firestore e Cloud Storage, ma possono comunque eseguire query, archiviare e accedere ai dati archiviati al loro interno.

Nei prossimi passaggi:

  • Registrati su App Check
  • Convalidare l'applicazione forzata
  • Iniziare ad applicare le regole

6. Attivare App Check e l'applicazione

Iniziamo acquisendo una chiave reCAPTCHA Enterprise per il tuo progetto e aggiungendola ad App Check. Per iniziare, vai alla sezione reCAPTCHA Enterprise della console Google Cloud. Seleziona il progetto e ti verrà chiesto di abilitare l'API reCAPTCHA Enterprise. Abilita l'API e attendi qualche minuto per il completamento. Quindi, fai clic su Crea chiave accanto a Chiavi aziendali. In questa sezione, specifica un nome visualizzato e seleziona una chiave di tipo Sito web. Devi specificare i domini su cui è ospitata la tua app. Poiché prevedi di ospitarlo su Firebase Hosting, utilizza il nome dell'hosting predefinito, che in genere è ${YOUR_PROJECT_ID}.web.app. Puoi trovare il tuo dominio di hosting nella sezione Hosting della Console Firebase. Dopo aver compilato queste informazioni, premi Fine e Crea chiave.

Schermata di creazione della chiave reCAPTCHA

Al termine, viene visualizzato un ID nella parte superiore della pagina Dettagli chiave.

La finestra di registrazione di reCAPTCHA Enterprise

Copia questo ID negli appunti. Si tratta della chiave che utilizzi per App Check. Poi, vai alla sezione Controllo app della Console Firebase e fai clic su Inizia. Poi, fai clic su Registrati, poi su reCAPTCHA Enterprise e inserisci l'ID copiato nella casella di testo per la chiave di sito reCAPTCHA Enterprise. Lascia le altre impostazioni predefinite. La pagina di controllo dell'app dovrebbe avere il seguente aspetto:

La finestra delle app App Check in cui registri il token reCAPTCHA Enterprise

Richieste non verificate e non applicate

Ora che hai una chiave registrata nella Console Firebase, torna a eseguire il sito nel browser eseguendo firebase serve. L'app web è in esecuzione localmente e puoi iniziare di nuovo a inviare richieste al backend di Firebase. Poiché le richieste violano il backend di Firebase, vengono monitorate da App Check, ma non vengono applicate. Se vuoi visualizzare lo stato delle richieste in arrivo, puoi visitare la sezione Cloud Firestore nella scheda API della pagina Controllo app nella Console Firebase. Poiché non hai ancora configurato il client per l'utilizzo di App Check, dovresti visualizzare qualcosa di simile al seguente:

Una dashboard di App Check che mostra il 100% delle richieste di client non verificate per la tua app.

Il backend riceve richieste non verificate al 100%. Questa schermata è utile perché mostra che quasi tutte le richieste dei client provengono da client che non hanno integrato App Check.

Questa dashboard può indicare diversi aspetti. La prima cosa che può indicare è se tutte le app client eseguono la versione più recente del client. In questo caso, puoi applicare App Check in tutta sicurezza senza preoccuparti di disattivare l'accesso per un client autentico della tua applicazione. L'altra cosa che potresti scoprire è il numero di tentativi di accesso al tuo backend che non provengono dall'interno della tua app. Potrebbero essere utenti che eseguono query direttamente sul tuo backend a tua insaputa. Poiché puoi vedere che le richieste non sono verificate, è il momento di capire cosa succederebbe agli utenti che potrebbero avere una richiesta non verificata al tuo backend prima di procedere alla verifica delle loro richieste.

Richieste non verificate e applicate

Vai avanti e premi il pulsante Applica nella schermata precedente, quindi premi di nuovo Applica se richiesto.

Un pannello delle metriche non verificato con un pulsante Applica evidenziato

Verrà avviata l'applicazione di App Check, che bloccherà le richieste ai servizi di backend non verificati tramite il fornitore di attestazione scelto (in questo caso reCAPTCHA Enterprise). Torna all'app web in esecuzione che dovrebbe essere in esecuzione su http://localhost:5000. Quando aggiorni la pagina e provi a recuperare i dati dal database, non succede nulla. Se apri la console di Chrome per leggere gli errori, dovresti vedere qualcosa di simile al seguente:

Uncaught Error in snapshot listener: FirebaseError: [code=permission-denied]: Missing or insufficient permissions.

Si tratta di richieste bloccate da App Check che non hanno trasmesso un token di attestazione valido nelle richieste alle tue risorse Firebase. Per il momento, puoi disattivare l'applicazione di App Check e nella sezione successiva esaminare come aggiungere App Check di reCAPTCHA Enterprise all'esempio di chat amichevole.

7. Aggiungere la chiave reCAPTCHA Enterprise al sito

Aggiungeremo la chiave aziendale alla tua applicazione. Innanzitutto, apri hosting/src/firebase-config.js e aggiungi la tua chiave reCAPTCHA Enterprise al seguente snippet di codice:

const reCAPTCHAEnterpriseKey = {
  // Replace with your recaptcha enterprise site key
  key: "Replace with your recaptcha enterprise site key"
};

Al termine, apri hosting/src/index.js e, nella riga 51, aggiungi un'importazione da firebase-config.js per recuperare la chiave reCAPTCHA e importare anche la libreria App Check in modo da poter utilizzare il provider reCAPTCHA Enterprise.

// add from here
 import {
   initializeAppCheck,
   ReCaptchaEnterpriseProvider,
 } from 'firebase/app-check';
// to here

// replace this line
import { getFirebaseConfig } from './firebase-config.js';
// with this line
import { getFirebaseConfig, getReCaptchaKey } from './firebase-config.js';

Poi, nella riga successiva, creerai una funzione per configurare App Check. La funzione controlla innanzitutto se ti trovi in un ambiente di sviluppo e, in questo caso, stampa un token di debug che puoi utilizzare per lo sviluppo locale.

import { getFirebaseConfig, getReCaptchaKey } from './firebase-config.js';
// add from here
 function setupAppCheck(app) {
   if(import.meta.env.MODE === 'development') {
     self.FIREBASE_APPCHECK_DEBUG_TOKEN = true;
   }
 }
// to here

Ora è il momento di inizializzare App Check in modo che funzioni con il provider selezionato, in questo caso reCAPTCHA Enterprise. Ti consigliamo inoltre di aggiornare automaticamente il token di App Check in background, in modo da evitare qualsiasi tipo di ritardo nell'interazione dell'utente con il tuo servizio nel caso in cui il token di App Check non fosse più valido.

function setupAppCheck(app) {
   if(import.meta.env.MODE === 'development') {
     self.FIREBASE_APPCHECK_DEBUG_TOKEN = true;
   }
// add from here
   // Create a ReCaptchaEnterpriseProvider instance using your reCAPTCHA Enterprise
   // site key and pass it to initializeAppCheck().
   initializeAppCheck(app, {
     provider: new ReCaptchaEnterpriseProvider(getReCaptchaKey()),
     isTokenAutoRefreshEnabled: true // Set to true to allow auto-refresh.
   });
// to here
 }

Infine, dopo aver verificato che l'app sia stata inizializzata, devi chiamare la funzione setupAppCheck che hai appena creato. Nella parte inferiore del file hosting/src/index.js, aggiungi la chiamata al metodo aggiunto di recente.

const firebaseApp = initializeApp(getFirebaseConfig());
// add from here
setupAppCheck(firebaseApp);
// to here
getPerformance();
initFirebaseAuth();
loadMessages();

Esegui prima il test a livello locale

Testa prima l'applicazione in locale. Se non stai già pubblicando l'applicazione localmente, esegui firebase serve. Dovresti notare che l'applicazione continua a non caricarsi localmente. Questo accade perché hai registrato il tuo dominio Firebase solo con il provider di attestazione reCAPTCHA e non con il dominio localhost. Non devi mai registrare localhost come dominio approvato, in quanto ciò consente agli utenti di accedere ai tuoi backend con limitazioni da un'applicazione in esecuzione localmente sulla loro macchina. Poiché hai impostato self.FIREBASE_APPCHECK_DEBUG_TOKEN = true, ti consigliamo di controllare nella console JavaScript se è presente una riga simile alla seguente:

App Check debug token: 55183c20-de61-4438-85e6-8065789265be. You will need to add it to your app's App Check settings in the Firebase console for it to work.

Dovresti prendere il token di debug fornito (nell'esempio è : 55183c20-de61-4438-85e6-8065789265be) e inserirlo nella configurazione di Controllo app nel menu overflow per la tua app.

La dashboard di App Check che indica la posizione di Gestisci token di debug

Assegna al token un nome univoco facile da ricordare e fai clic su Salva. Questa opzione ti consente di utilizzare un token generato dal client con la tua app, un'alternativa più sicura rispetto alla generazione di un token di debug e alla sua incorporazione all'interno dell'applicazione. Se incorpori un token all'interno dell'app, questo potrebbe essere distribuito accidentalmente agli utenti finali, che potrebbero sfruttarlo bypassando i tuoi controlli. Se vuoi distribuire un token di debug, ad esempio in un ambiente CI, leggi questa documentazione per scoprire di più su come distribuirlo.

Un esempio di compilazione del token di debug con un alias

Una volta registrato il token di debug nella Console Firebase, puoi riattivare l'applicazione di App Check e verificare che i contenuti dell'app vengano caricati localmente chiamando firebase serve dal terminale. Dovresti vedere i dati inseriti in precedenza pubblicati nella versione locale dell'applicazione web. Dovresti comunque vedere il messaggio con il token di debug stampato nella console.

Provare la funzionalità in produzione

Una volta che hai verificato che App Check funziona localmente, esegui il deployment dell'applicazione web in produzione. Dal terminale, richiama firebase deploy e ricarica la pagina. In questo modo, l'applicazione web verrà pacchettizzata per l'esecuzione su Firebase Hosting. Una volta che l'applicazione è ospitata su Firebase Hosting, prova a visitarla all'indirizzo ${YOUR_PROJECT_ID}.web.app. Puoi aprire la console JavaScript e non dovresti più vedere il token di debug stampato e dovresti vedere il caricamento delle chat nel tuo progetto. Inoltre, dopo aver interagito con l'applicazione per alcuni istanti, puoi visitare la sezione App Check della console Firebase e verificare che tutte le richieste alla tua applicazione siano state verificate.

8. Complimenti!

Congratulazioni, hai aggiunto Firebase App Check a un'app web.

Puoi configurare la Console Firebase per gestire un token reCAPTCHA Enterprise per gli ambienti di produzione e persino configurare token di debug per lo sviluppo locale. In questo modo, le tue app potranno continuare ad accedere alle risorse di Firebase da client approvati e verrà impedita la comparsa di attività fraudolente all'interno della tua applicazione.

Passaggi successivi

Consulta la seguente documentazione per aggiungere Firebase App Check a:

Documentazione di riferimento