Risoluzione dei problemi di convalida JWT

Quando un'applicazione client include un token JWT (JSON Web Token) in una richiesta a un API, l'Extensible Service Proxy (ESP) convalida il JWT prima di inviare la richiesta all'API di un backend cloud. Questa pagina fornisce informazioni per la risoluzione dei problemi se la convalida JWT non va a buon fine e l'ESP restituisce un errore nella risposta al client. Consulta: Per ulteriori informazioni, consulta RFC 7519 sui JWT.

Errore: 401: Jwt issuer is not configured

Questo può accadere durante 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 <a=" docs=&quot;&quot; managing-access&quot;=&quot;&quot; run=&quot;&quot; securing=&quot;&quot;&gt;access che controllano il server IAM e non da ESPv2. IAM può utilizzare un emittente diverso da ESPv2. &lt;/a=&quot;&gt;

Errore: BAD_FORMAT

Controlla quanto segue:

  • Assicurati che il token 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"
  • Verifica il tipo di dati dei seguenti campi (se presenti) nella Payload JWT:
    • I seguenti dati: "iat" (emesso alle ore), "exp" (data di scadenza) e "nbf"(non prima) le rivendicazioni sono numeri maggiori di 0 e non stringhe.
    • I campi "sub" (oggetto), "iss" (emittente) e "jti" (ID JWT) sono stringhe.
    • L'attestazione "aud" (pubblico) è una stringa o un array di stringhe.
  • Assicurati che nel payload JWT siano presenti le seguenti attestazioni: "sub" (soggetto), "iss" (emittente) e "aud" (pubblico).

Di seguito è riportato un esempio di token JWT decodificato che è 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:

  • La rivendicazione "exp" (tempo di scadenza) esiste.
  • Il valore della rivendicazione "exp" (data e ora di scadenza) è una data e un'ora nel futuro. La data e l'ora correnti devono essere precedenti alla data e all'ora di scadenza indicate nella rivendicazione "exp".
  • L'affermazione "nbf" (non prima) (se presente) è una data e un'ora nel passato. La data e l'ora correnti devono essere successive o uguali alla data e all'ora indicate in la rivendicazione "nbf".
Errore: UNKNOWN

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

  • Se la rivendicazione di "iss" (emittente) è un indirizzo email, l'importo di "sub" (oggetto) e "iss" di rivendicazioni devono essere uguali. Questo serve a garantire che per gli emittenti di email, il JWT sia emesso automaticamente.

Errore: KEY_RETRIEVAL_ERROR

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

Errore: Issuer not allowed

  • Verifica che l'attributo "iss" (issuer) nel token JWT corrisponda al campo x-google-issuer nella sezione securityDefinitions dell'oggetto security nel documento OpenAPI.

  • Nel documento OpenAPI, verifica che l'oggetto di sicurezza sia attivato per il metodo dell'API invocato.

Consulta le esempio di openapi.yaml per un esempio di come descrivere la sicurezza a livello di metodo utilizzando securityDefinition e security di oggetti.

Errore: Audience not allowed

Confronta l'affermazione "aud" (segmento di pubblico) in un token JWT per verificare se corrisponde al nome del servizio Endpoints, che corrisponde al campo host nel documento OpenAPI.

Se l'attestazione "aud" e il nome del servizio Endpoints sono diverso:

  • Verifica che l'affermazione "aud" nel 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 modo securityDefinitions nel tuo documento OpenAPI.

Se l'attestazione "aud" e il nome del servizio Endpoints sono uguali, l'ESP convalida il pubblico e ignora x-google-audiences nel documento OpenAPI. Ad esempio, se il nome del 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 segmento di pubblico valido.