Fehler in JWT-Validierung beheben

Wenn eine Clientanwendung einer API-Anfrage ein JSON Web Token (JWT) hinzufügt, validiert der Extensible Service Proxy (ESP) das JWT, bevor die Anfrage an das API-Back-End gesendet wird. Auf dieser Seite finden Sie Informationen zur Fehlerbehebung, wenn die JWT-Validierung fehlschlägt und der ESP in der Antwort an den Client einen Fehler zurückgibt. Weitere Informationen zu JWTs finden Sie in RFC 7519.

Fehler: BAD_FORMAT

Prüfen Sie Folgendes:

  • Achten Sie darauf, dass das JWT gültigen JSON-Code enthält.
  • Prüfen Sie, ob im JWT-Header das Feld "alg" enthalten und dafür einer der folgenden Werte festgelegt ist: "RS256", "HS256", "RS384", "HS384", "RS512" oder "HS512".
  • Prüfen Sie den Datentyp der folgenden Felder (falls vorhanden) in der JWT-Nutzlast:
    • Die Anforderungen "iat" (issued at), "exp" (expiration time) und "nbf" (not before) sind Zahlen größer als 0 und keine Strings.
    • Die Felder "sub" (subject), "iss" (issuer) und "jti" (JWT ID) sind Strings.
    • Die Anforderung "aud" (audience) ist entweder ein String oder ein Array mit Strings.
  • Achten Sie darauf, dass die folgenden Anforderungen in der JWT-Nutzlast vorhanden sind: "sub" (subject), "iss" (issuer) und "aud" (audience).

Das folgende Beispiel enthält ein decodiertes gültiges JWT:

    {
      "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"
    }
    
Fehler: TIME_CONSTRAINT_FAILURE

Decodieren Sie das JWT mit jwt.io und stellen Sie Folgendes sicher:

  • Die Anforderung "exp" (expiration time) ist vorhanden.
  • Die Anforderung "exp" (expiration time) enthält einen Datum/Uhrzeit-Wert in der Zukunft. Das aktuelle Datum und die aktuelle Uhrzeit müssen vor dem Ablaufdatum und der Ablaufzeit liegen, die in der Anforderung "exp" angegeben sind.
  • Die Anforderung "nbf" (not before) ist, sofern vorhanden, ein Datum und eine Uhrzeit in der Vergangenheit. Das aktuelle Datum und die aktuelle Uhrzeit müssen nach dem Datum und der Uhrzeit liegen, die in der Anforderung "nbf" angegeben sind, oder diesen Werten entsprechen.
Fehler: UNKNOWN

Decodieren Sie das JWT mit jwt.io und gewährleisten Sie Folgendes:

  • Wenn die Anforderung "iss" (issuer) eine E-Mail-Adresse ist, müssen die Anforderungen "sub" (subject) und "iss" identisch sein. Damit wird bei E-Mail-Ausstellern sichergestellt, dass es sich um ein selbst ausgestelltes JWT handelt.

Fehler: KEY_RETRIEVAL_ERROR

  • Prüfen Sie, ob der im Feld x-google-jwks_uri Ihres OpenAPI-Dokuments angegebene öffentliche Schlüssel-URI korrekt und gültig ist.

Fehler: Issuer not allowed

  • Prüfen Sie, ob die Anforderung "iss" (issuer) in Ihrem JWT-Token mit dem Feld x-google-issuer im Abschnitt securityDefinitions des Sicherheitsobjekts in Ihrem OpenAPI-Dokument übereinstimmt.

  • Prüfen Sie, ob das Sicherheitsobjekt für die aufgerufene API-Methode im OpenAPI-Dokument aktiviert ist.

Die Beispieldatei openapi.yaml veranschaulicht, wie die Sicherheit auf Methodenebene mit den Objekten securityDefinition und security beschrieben werden kann.

Fehler: Audience not allowed

Vergleichen Sie die Anforderung "aud" (audience) in einem JWT-Token, um festzustellen, ob sie mit dem Endpoints-Dienstnamen übereinstimmt, der dem Feld host im OpenAPI-Dokument entspricht.

Wenn die Anforderung "aud" und der Endpoints-Dienstname unterschiedlich sind:

  • Prüfen Sie, ob die Anforderung "aud" im JWT-Token mit einem der x-google-audiences-Werte übereinstimmt, die im OpenAPI-Dokument angegeben sind.

  • Achten Sie darauf, dass sich x-google-audiences und x-google-issuer im selben securityDefinitions-Objekt in Ihrem OpenAPI-Dokument befinden.

Wenn die Anforderung "aud" und der Endpoints-Dienstname identisch sind, prüft der ESP die Zielgruppe und ignoriert die x-google-audiences-Werte in Ihrem OpenAPI-Dokument. Wenn Ihr Dienstname beispielsweise "myservice.endpoints.example-project-12345.cloud.goog" lautet, ist ein JWT mit "aud" für "myservice.endpoints.example-project-12345.cloud.goog" oder "https://myservice.endpoints.example-project-12345.cloud.goog" eine gültige Zielgruppe.