Menggunakan token ID Google untuk mengautentikasi pengguna

Halaman ini menjelaskan cara mendukung autentikasi pengguna di API Gateway.

Untuk mengautentikasi pengguna, aplikasi klien harus mengirimkan Token Web JSON (JWT) di header otorisasi permintaan HTTP ke API backend Anda. API Gateway memvalidasi token atas nama API Anda, sehingga Anda tidak perlu menambahkan kode apa pun di API untuk memproses autentikasi. Namun, Anda perlu mengonfigurasi konfigurasi API untuk gateway agar mendukung metode autentikasi yang dipilih.

API Gateway memvalidasi JWT dengan cara yang berperforma tinggi menggunakan JSON Web Key Set (JWKS) penerbit JWT. Lokasi JWKS ditentukan di kolom x-google-jwks_uri pada konfigurasi API gateway. API Gateway meng-cache JWKS selama lima menit dan memuat ulang setiap lima menit.

Sebelum memulai

  • Tambahkan kode autentikasi ke aplikasi klien Anda yang memungkinkan pengguna melakukan autentikasi dengan login dengan akun Google.

  • Saat aplikasi klien Anda mengirim permintaan HTTP, header otorisasi dalam permintaan harus berisi klaim JWT berikut:
    • iss (penerbit)
    • sub (subjek)
    • aud (audiens)
    • iat (diterbitkan pada)
    • exp (waktu habis masa berlaku)

Mengonfigurasi API Gateway untuk mendukung autentikasi klien

Anda harus memiliki objek persyaratan keamanan dan objek definisi keamanan di konfigurasi API agar API Gateway dapat memvalidasi klaim dalam JWT yang ditandatangani.

Untuk mendukung autentikasi menggunakan token ID Google:

  1. Tambahkan hal berikut ke definisi keamanan di konfigurasi API Anda, yang mengikuti skema keamanan OpenAPI 2.0:

      securityDefinitions:
        google_id_token:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          x-google-issuer: "https://accounts.google.com"
          x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
          # Optional. Replace YOUR-CLIENT-ID with your client ID
          x-google-audiences: "YOUR-CLIENT-ID"
    
  2. Tambahkan bagian keamanan di tingkat API untuk diterapkan ke seluruh API, atau di tingkat metode untuk diterapkan ke metode tertentu.

      security:
        - google_id_token: []
    

Anda dapat menentukan beberapa definisi keamanan dalam konfigurasi API, tetapi setiap definisi harus memiliki penerbit yang berbeda. Jika Anda menggunakan bagian keamanan di API level dan di level metode, setelan level metode akan menggantikan setelan API level.

Kolom x-google-audiences tidak wajib diisi. API Gateway menerima semua JWT dengan nama layanan backend dalam bentuk https://SERVICE_NAME dalam klaim aud.

Untuk mengizinkan client ID tambahan mengakses layanan backend, Anda dapat menentukan client ID yang diizinkan di kolom x-google-audiences menggunakan nilai yang dipisahkan koma. API Gateway kemudian menerima JWT dengan salah satu ID klien yang ditentukan dalam klaim aud.

Melakukan panggilan yang diautentikasi ke API API Gateway

Saat mengirim permintaan menggunakan token autentikasi, sebaiknya tempatkan token di header Authorization:Bearer. Misalnya:

curl --request POST \
  --header "Authorization: Bearer ${TOKEN}" \
  "${GATEWAY_URL}/echo"

Di sini, GATEWAY_URL dan TOKEN adalah variabel lingkungan yang masing-masing berisi URL gateway dan token autentikasi yang di-deploy. Lihat Membuat permintaan terautentikasi ke API Gateway API untuk mengetahui contoh kode yang mengirim permintaan menggunakan header Authorization:Bearer.

Jika tidak dapat menggunakan header saat mengirim permintaan, Anda dapat menempatkan token autentikasi dalam parameter kueri yang disebut access_token. Contoh:

curl "${GATEWAY_URL}/echo?access_token=${TOKEN}"

Menerima hasil yang diautentikasi di API Anda

API Gateway biasanya meneruskan semua header yang diterimanya. Namun, header ini akan menggantikan header Authorization asli saat alamat backend ditentukan oleh x-google-backend dalam konfigurasi API.

API Gateway akan mengirimkan hasil autentikasi di X-Apigateway-Api-Userinfo ke API backend. Sebaiknya gunakan header ini, bukan header Authorization asli. Header ini dienkode base64url dan berisi payload JWT.

Langkah selanjutnya