Memecahkan masalah validasi JWT

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

Error: 401: Jwt issuer is not configured

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

Error: BAD_FORMAT

Periksa hal-hal berikut:

  • Pastikan JWT berisi JSON yang valid.
  • Periksa apakah header JWT memiliki kolom "alg" dan disetel ke salah satu berikut: "RS256", "HS256", "RS384", "HS384", "RS512", atau "HS512"
  • Periksa jenis data kolom berikut (jika ada) di payload JWT:
    • Klaim "iat" (dikeluarkan pada), "exp" (waktu habis masa berlaku), dan "nbf"(tidak 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) berupa string atau array string.
  • Pastikan klaim berikut ada di payload JWT: "sub" (subjek), "iss" (penerbit), dan "aud" (audiens).

Berikut adalah contoh token JWT yang didekode dan 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" (tidak sebelum) (Jika ada) adalah tanggal dan waktu di masa 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 pastikan bahwa:

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

Error: KEY_RETRIEVAL_ERROR

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

Error: Issuer not allowed

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

  • Di dokumen OpenAPI Anda, periksa apakah objek keamanan diaktifkan untuk metode API yang dipanggil.

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

Error: Audience not allowed

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

Jika klaim "aud" dan nama layanan Endpoints berbeda:

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

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

Jika klaim "aud" dan nama layanan Endpoints 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", maka 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.