Utilizzo di Firebase per autenticare gli utenti

Questa pagina descrive come supportare l'autenticazione utente in Cloud Endpoints.

Per autenticare un utente, un'applicazione client deve inviare un token JWT (JSON Web Token) nell'intestazione di autorizzazione della richiesta HTTP all'API di backend. Il Extensible Service Proxy (ESP) convalida il token per conto della tua API, quindi non devi aggiungere codice all'API per elaborare l'autenticazione. Tuttavia, devi configurare il documento OpenAPI per supportare i metodi di autenticazione scelti.

ESP convalida un JWT in modo efficiente utilizzando le chiavi pubbliche dell'emittente del JWT. ESP memorizza nella cache le chiavi pubbliche per cinque minuti. Inoltre, ESP memorizza nella cache i JWT convalidati per cinque minuti o fino alla scadenza del JWT, a seconda di quale si verifica per prima.

Prima di iniziare

  • Aggiungi il codice di autenticazione all'applicazione client, seguendo la documentazione, di Firebase Authentication. Firebase supporta l'autenticazione tramite password, numeri di telefono e provider di identità federati più diffusi come Google, Facebook e Twitter.

  • Quando l'applicazione client invia una richiesta HTTP, l'intestazione di autorizzazione nella richiesta deve contenere le seguenti attestazioni JWT:
    • iss (emittente)
    • sub (oggetto)
    • aud (pubblico)
    • iat (emesso il giorno)
    • exp (data/ora di scadenza)

Configurare il documento OpenAPI

Per consentire a ESP di convalidare le attestazioni nel JWT firmato, nel documento OpenAPI devi avere un oggetto dei requisiti di sicurezza e un oggetto delle definizioni di sicurezza.

Per supportare Firebase Authentication:

OpenAPI 2.0

  1. Aggiungi quanto segue alla specifica OpenAPI:
    securityDefinitions:
       firebase:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          # Replace PROJECT_ID with your project ID
          x-google-issuer: "https://securetoken.google.com/PROJECT_ID"
          x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
          x-google-audiences: "PROJECT_ID"
  2. Aggiungi una sezione di sicurezza a livello di API per applicarla all'intera API o a livello di metodo per applicarla a un metodo specifico.
    security:
       -   firebase: []

OpenAPI 3.x

  1. Aggiungi quanto segue alla specifica OpenAPI:
    components:
      securitySchemes:
        firebase:
          type: oauth2
          flows:
           implicit:
             authorizationUrl: ""
             scopes: {}
          x-google-auth:
            # Replace PROJECT_ID with your project ID
            issuer: https://securetoken.google.com/PROJECT_ID
            jwksUri: https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com
            audiences:
              - PROJECT_ID
  2. Aggiungi una sezione di sicurezza a livello di API per applicarla all'intera API o a livello di metodo per applicarla a un metodo specifico.
    security:
      - firebase: []

Puoi definire più definizioni di sicurezza nel documento OpenAPI, ma ogni definizione deve avere un emittente diverso. Se utilizzi le sezioni di sicurezza sia a livello API sia a livello di metodo, le impostazioni a livello di metodo sostituiscono quelle a livello API.

Puoi anche personalizzare le posizioni JWT aggiungendo le estensioni x-google. Per i dettagli, vedi Estensioni OpenAPI 2.0 o Estensioni OpenAPI 3.x.

Effettuare una chiamata autenticata a un'API Endpoints

Quando invii una richiesta utilizzando un token di autenticazione, per motivi di sicurezza ti consigliamo di inserire il token nell'intestazione Authorization:Bearer. Ad esempio:

curl -H "Authorization: Bearer <var>TOKEN</var>" "<var>ENDPOINTS_HOST</var>/echo"

Qui, sostituisci le variabili ENDPOINTS_HOST e TOKEN rispettivamente con il nome host dell'API e il token di autenticazione. Per un codice campione che invia una richiesta utilizzando l'intestazione Authorization:Bearer, vedi Effettuare una richiesta autenticata a un'API Endpoints.

Se non puoi utilizzare l'intestazione quando invii la richiesta, puoi inserire il token di autenticazione in un parametro di query denominato access_token. Ad esempio:

curl "<var>ENDPOINTS_HOST</var>/echo?access_token=<var>TOKEN</var>"

Ricevere risultati autenticati nell'API

In genere, ESP inoltra tutte le intestazioni che riceve. Tuttavia, sostituisce l'intestazione Authorization originale quando l'indirizzo di backend è specificato da x-google-backend nella specifica OpenAPI o da BackendRule nella configurazione del servizio gRPC.

ESP invierà il risultato dell'autenticazione nell'intestazione X-Endpoint-API-UserInfo all'API di backend. Ti consigliamo di utilizzare questa intestazione anziché l'intestazione Authorization originale. Questa intestazione è una stringa che codifica un oggetto JSON in formato base64url. Il formato dell'oggetto JSON è diverso tra ESPv2 ed ESP. Per ESPv2, l'oggetto JSON è esattamente il payload JWT originale. Per ESP, l'oggetto JSON utilizza nomi di campi diversi e inserisce il payload JWT originale nel campo claims. Per ulteriori informazioni sul formato, vedi Gestire i JWT nel servizio di backend.

Passaggi successivi