Memecahkan masalah validasi JWT

Jika aplikasi klien menyertakan Token Web JSON (JWT) dalam permintaan ke API, Extensible Service Proxy (ESP) akan memvalidasi JWT sebelum mengirim permintaan ke backend API. Halaman ini memberikan informasi pemecahan masalah jika validasi JWT gagal dan ESP menampilkan error sebagai respons kepada klien. Lihat RFC 7519 untuk informasi JWT lebih lanjut.

Error: 401: Jwt issuer is not configured

Hal ini dapat terjadi saat men-deploy ESPv2 di Cloud Run, flag --allow-unauthenticated tidak digunakan dalam perintah gcloud run deploy. Jika tanda tersebut tidak digunakan, token JWT dicegat dan diverifikasi oleh Cloud Run <a=" docs=""managing-access"="" run="" securing="">server IAM kontrol akses dan bukan oleh ESPv2. IAM dapat menggunakan penerbit yang berbeda dari ESPv2. </a=">

Error: BAD_FORMAT

Periksa hal-hal berikut:

  • Pastikan JWT berisi JSON yang valid.
  • Pastikan header JWT memiliki kolom "alg" dan disetel ke salah satu dari berikut: "RS256", "HS256", "RS384", "HS384", "RS512", atau "HS512"
  • Periksa jenis data kolom berikut (jika ada) dalam payload JWT:
    • Klaim "iat" (diterbitkan pada), "exp" (waktu habis masa berlaku), dan "nbf"(bukan sebelum) adalah angka yang lebih besar dari 0 dan bukan string.
    • Kolom "sub" (subjek), "iss" (penerbit), dan "jti" (ID JWT) adalah string.
    • Klaim "aud" (audiens) dapat berupa string atau array string.
  • Pastikan klaim berikut ada dalam payload JWT: "sub" (subjek), "iss" (penerbit), dan "aud" (audiens).

Berikut adalah contoh token JWT yang didekode yang valid:

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

Gunakan jwt.io untuk mendekode JWT dan pastikan bahwa:

  • Klaim "exp" (waktu habis masa berlaku) ada.
  • Nilai klaim "exp" (waktu habis masa berlaku) adalah tanggal dan waktu di masa mendatang. Tanggal dan waktu saat ini harus sebelum tanggal dan waktu habis masa berlaku yang tercantum dalam klaim "exp".
  • Klaim "nbf" (bukan sebelum) (Jika ada) adalah tanggal dan waktu yang lalu. Tanggal dan waktu saat ini harus setelah atau sama dengan tanggal dan waktu yang tercantum dalam klaim "nbf".
Error: UNKNOWN

Gunakan jwt.io untuk mendekode JWT dan memastikan bahwa:

  • Jika klaim "iss" (penerbit) adalah alamat email, klaim "sub" (subjek) dan "iss" harus sama. Hal ini untuk memastikan bahwa untuk penerbit email, JWT diterbitkan sendiri.

Error: KEY_RETRIEVAL_ERROR

  • Pastikan URI kunci publik yang ditentukan dalam kolom x-google-jwks_uri di dokumen OpenAPI sudah benar dan valid.

Error: Issuer not allowed

  • Periksa apakah klaim "iss" (penerbit) di token JWT Anda cocok dengan kolom x-google-issuer di bagian securityDefinitions pada objek keamanan di dokumen OpenAPI Anda.

  • Dalam dokumen OpenAPI, pastikan objek keamanan telah diaktifkan untuk metode API yang dipanggil.

Lihat file contoh openapi.yaml untuk contoh cara mendeskripsikan keamanan di level metode menggunakan objek securityDefinition dan security.

Error: Audience not allowed

Bandingkan klaim "aud" (audiens) dalam token JWT untuk melihat apakah klaim tersebut cocok dengan nama layanan Endpoint, yang sesuai dengan kolom host dalam dokumen OpenAPI.

Jika klaim "aud" dan nama layanan Endpoint berbeda:

  • Pastikan klaim "aud" di JWT cocok dengan salah satu nilai x-google-audiences yang ditetapkan dalam dokumen OpenAPI Anda.

  • Pastikan x-google-audiences dan x-google-issuer berada di objek securityDefinitions yang sama di dokumen OpenAPI Anda.

Jika klaim "aud" dan nama layanan Endpoint sama, ESP akan memvalidasi audiens dan mengabaikan nilai x-google-audiences dalam dokumen OpenAPI Anda. Misalnya, jika nama layanan Anda adalah "myservice.endpoints.example-project-12345.cloud.goog", JWT dengan "aud" yang ditetapkan ke "myservice.endpoints.example-project-12345.cloud.goog" atau "https://myservice.endpoints.example-project-12345.cloud.goog" adalah audiens yang valid.