Risoluzione dei problemi di convalida JWT

Quando un'applicazione client include un token web JSON (JWT) in una richiesta a un'API, Extensible Service Proxy (ESP) convalida il JWT prima di inviare la richiesta al backend dell'API. Questa pagina fornisce informazioni per la risoluzione dei problemi qualora la convalida JWT non vada a buon fine e ESP restituisca un errore nella risposta del client. Per ulteriori informazioni sui JWT, consulta RFC 7519.

Errore: 401: Jwt issuer is not configured

Questo può verificarsi quando si esegue il deployment di ESPv2 in Cloud Run, il flag --allow-unauthenticated non viene utilizzato nel comando gcloud run deploy. Se il flag non viene utilizzato, il token JWT viene intercettato e verificato da Cloud Run &lt&atquot; docs={quot;" management-access"={quot;" run={quot;" securing={quot;">access control IAM server e non da ESPv2. IAM può utilizzare un emittente diverso da ESPv2. </a={quot;>

Errore: BAD_FORMAT

Controlla quanto segue:

  • Assicurati che il JWT contenga un JSON valido.
  • Verifica che l'intestazione JWT abbia il campo "alg" e che sia impostata su uno dei seguenti: "RS256", "HS256", "RS384", "HS384", "RS512" o "HS512"
  • Controlla il tipo di dati dei seguenti campi (se presenti) nel payload JWT:
    • I reclami "iat" (emessi), "exp" (scadenza) e "nbf"(non prima) sono numeri maggiori di 0 e non stringhe.
    • I campi "sub" (oggetto), "iss" (emittente) e "jti" (JWT ID) sono stringhe.
    • La dichiarazione "aud" (audience) è una stringa o un array di stringhe.
  • Assicurati che le seguenti dichiarazioni siano presenti nel payload JWT: "sub" (oggetto), "iss" (emittente) e "aud" (segmento di pubblico).

Di seguito è riportato un esempio di token JWT decodificato valido:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "42ba1e234ac91ffca687a5b5b3d0ca2d7ce0fc0a"
}

Payload:
{
  "iss": "myservice@myproject.iam.gserviceaccount.com",
  "iat": 1493833746,
  "aud": "myservice.appspot.com",
  "exp": 1493837346,
  "sub": "myservice@myproject.iam.gserviceaccount.com"
}
Errore: TIME_CONSTRAINT_FAILURE

Utilizza jwt.io per decodificare il JWT e assicurati che:

  • Il reclamo "exp" (scadenza).
  • Il valore della rivendicazione "exp" (scadenza) è una data e un'ora nel futuro. La data e l'ora correnti devono essere precedenti alla data di scadenza e all'ora elencate nella rivendicazione "exp".
  • La dichiarazione "nbf" (non prima) (se presente) indica una data e un'ora nel passato. La data e l'ora correnti devono essere successive o uguali alla data e all'ora elencate nella rivendicazione "nbf".
Errore: UNKNOWN

Per decodificare il JWT, utilizza jwt.io e assicurati che:

  • Se la rivendicazione dell'"iss" (emittente) è un indirizzo email, le rivendicazioni dell'elemento "sub" (oggetto) e "iss" devono essere uguali. Questo serve a garantire che per gli emittenti delle email il JWT venga emesso autonomamente.

Errore: KEY_RETRIEVAL_ERROR

  • Verifica che l'URI della chiave pubblica specificato nel campo x-google-jwks_uri nel documento OpenAPI sia corretto e valido.

Errore: Issuer not allowed

  • Verifica che la dichiarazione "iss" (emittente) nel token JWT corrisponda al campo x-google-issuer nella sezione securityDefinitions dell'oggetto di sicurezza nel documento OpenAPI.

  • Nel documento OpenAPI, verifica che l'oggetto sicurezza sia abilitato per il metodo API richiamato.

Consulta il file sample openapi.yaml per un esempio di come descrivere la sicurezza a livello di metodo mediante gli oggetti securityDefinition e security.

Errore: Audience not allowed

Confronta la rivendicazione (pubblico) di "aud" in un token JWT per verificare se corrisponde al nome del servizio Endpoint, che corrisponde al campo host nel documento OpenAPI.

Se la rivendicazione "aud" e il nome del servizio Endpoints sono diversi:

  • Verifica che la dichiarazione "aud" in JWT corrisponda a uno dei valori x-google-audiences specificati nel documento OpenAPI.

  • Assicurati che x-google-audiences e x-google-issuer siano nello stesso oggetto securityDefinitions nel documento OpenAPI.

Se la rivendicazione "aud" e il nome del servizio Endpoints sono uguali, ESP convalida il pubblico e ignora i valori x-google-audiences nel documento OpenAPI. Ad esempio, se il nome del tuo servizio è "myservice.endpoints.example-project-12345.cloud.goog", un JWT con "aud" impostato su "myservice.endpoints.example-project-12345.cloud.goog" o "https://myservice.endpoints.example-project-12345.cloud.goog" è un pubblico valido.