Autentikasi antar-layanan
Selain mengautentikasi permintaan pengguna akhir, Anda mungkin ingin mengautentikasi layanan (pengguna non-manusia) yang membuat permintaan ke API Anda. Halaman ini menjelaskan cara menggunakan akun layanan untuk menyediakan autentikasi bagi pengguna atau layanan.
Ringkasan
Untuk mengidentifikasi layanan yang mengirim permintaan ke API Anda, Anda menggunakan akun layanan. Layanan panggilan menggunakan kunci pribadi akun layanan untuk menandatangani Token Web JSON (JWT) yang aman dan mengirimkan JWT yang ditandatangani dalam permintaan ke API Anda.
Untuk menerapkan autentikasi akun layanan di API dan layanan panggilan Anda:
- Buat akun layanan dan kunci untuk digunakan oleh layanan panggilan.
- Tambahkan dukungan untuk autentikasi di konfigurasi API untuk layanan API Gateway Anda.
Tambahkan kode ke layanan panggilan yang:
- Membuat JWT dan menandatanganinya dengan kunci pribadi akun layanan.
- Mengirim JWT yang ditandatangani dalam permintaan ke API.
API Gateway memvalidasi bahwa klaim dalam JWT cocok dengan konfigurasi di konfigurasi API Anda sebelum meneruskan permintaan ke API Anda. API Gateway tidak memeriksa izin Cloud Identity yang telah Anda berikan pada akun layanan.
Prasyarat
Halaman ini mengasumsikan bahwa Anda telah:
Membuat akun layanan dengan kunci
Anda memerlukan akun layanan dengan file kunci pribadi yang digunakan oleh layanan pemanggil untuk menandatangani JWT. Jika Anda memiliki lebih dari satu layanan yang mengirim permintaan ke API, Anda dapat membuat satu akun layanan untuk mewakili semua layanan yang memanggil. Jika Anda perlu membedakan layanan—misalnya, layanan tersebut mungkin memiliki izin yang berbeda—Anda dapat membuat akun layanan dan kunci untuk setiap layanan panggilan.
Bagian ini menunjukkan cara menggunakan konsol Google Cloud dan alat command line gcloud
untuk membuat akun layanan dan file kunci pribadi serta menetapkan peran
Service Account Token Creator
ke akun layanan. Untuk mengetahui informasi tentang cara menggunakan API untuk melakukan tugas ini, lihat
Membuat dan mengelola akun layanan.
Untuk membuat akun layanan dengan kunci:
Google Cloud console
Buat akun layanan:
Di konsol Google Cloud , buka Create service account.
Pilih project.
Di kolom Nama akun layanan, masukkan nama. KonsolGoogle Cloud akan mengisi kolom Service account ID berdasarkan nama ini.
Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
Klik Buat.
Klik kolom Pilih peran.
Di bagian Semua peran, pilih Akun Layanan > Pembuat Token Akun Layanan.
Klik Lanjutkan.
Klik Selesai untuk menyelesaikan pembuatan akun layanan.
Jangan tutup jendela browser Anda. Anda akan menggunakan halaman tersebut pada prosedur berikutnya.
Membuat kunci akun layanan:
- Di konsol Google Cloud , klik alamat email untuk akun layanan yang telah dibuat.
- Klik Kunci.
- Klik Tambahkan kunci, lalu Buat kunci baru.
- Klik Buat. File kunci JSON akan didownload ke komputer Anda.
- Klik Close.
gcloud
Anda dapat menjalankan perintah berikut menggunakan Google Cloud CLI di komputer lokal, atau di dalam Cloud Shell.
Tetapkan akun default untuk
gcloud
. Jika Anda memiliki lebih dari satu akun, pastikan untuk memilih akun yang ada di Google Cloud project yang ingin Anda gunakan.gcloud auth login
Menampilkan project ID untuk Google Cloud project Anda.
gcloud projects list
Tetapkan project default. Ganti
PROJECT_ID
dengan Google Cloud project ID yang ingin Anda gunakan.gcloud config set project PROJECT_ID
Membuat akun layanan. Ganti
SA_NAME
danSA_DISPLAY_NAME
dengan nama dan nama tampilan yang ingin Anda gunakan.gcloud iam service-accounts create SA_NAME \ --display-name "SA_DISPLAY_NAME"
Tampilkan alamat email untuk akun layanan yang baru saja Anda buat.
gcloud iam service-accounts list
Tambahkan peran Service Account Token Creator. Ganti
SA_EMAIL_ADDRESS
dengan alamat email akun layanan.gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SA_EMAIL_ADDRESS \ --role roles/iam.serviceAccountTokenCreator
Buat file kunci akun layanan di direktori kerja saat ini. Ganti
FILE_NAME
dengan nama yang ingin Anda gunakan untuk file kunci. Secara default, perintahgcloud
akan membuat file JSON.gcloud iam service-accounts keys create FILE_NAME.json \ --iam-account SA_EMAIL_ADDRESS
Lihat
referensi gcloud
untuk mengetahui informasi selengkapnya tentang perintah sebelumnya.
Untuk mengetahui informasi tentang cara mengamankan kunci pribadi, lihat Praktik terbaik untuk mengelola kredensial.
Mengonfigurasi API untuk mendukung autentikasi
Saat membuat konfigurasi API untuk gateway, Anda menentukan akun layanan yang digunakan gateway untuk berinteraksi dengan layanan lain. Untuk mengaktifkan autentikasi akun layanan bagi layanan yang memanggil gateway Anda, ubah objek persyaratan keamanan dan objek definisi keamanan di konfigurasi API Anda. Dengan mengikuti langkah-langkah di bawah, API Gateway dapat memvalidasi klaim dalam JWT bertanda tangan yang digunakan oleh layanan panggilan.
Tambahkan akun layanan sebagai penerbit dalam konfigurasi API Anda.
securityDefinitions: DEFINITION_NAME: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "SA_EMAIL_ADDRESS" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/SA_EMAIL_ADDRESS"
- Ganti
DEFINITION_NAME
dengan string yang mengidentifikasi definisi keamanan ini. Anda mungkin ingin menggantinya dengan nama akun layanan atau nama yang mengidentifikasi layanan panggilan. - Ganti
SA_EMAIL_ADDRESS
dengan alamat email akun layanan. - Anda dapat menentukan beberapa definisi keamanan dalam konfigurasi API, tetapi setiap definisi harus memiliki
x-google-issuer
yang berbeda. Jika Anda telah membuat akun layanan terpisah untuk setiap layanan panggilan, Anda dapat membuat definisi keamanan untuk setiap akun layanan, misalnya:
securityDefinitions: service-1: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-1@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345.iam.gserviceaccount.com" service-2: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-2@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345.iam.gserviceaccount.com"
- Ganti
Secara opsional, tambahkan
x-google-audiences
ke bagiansecurityDefinitions
. Jika Anda tidak menambahkanx-google-audiences
, API Gateway akan mewajibkan klaim"aud"
(audiens) dalam JWT memiliki formathttps://SERVICE_NAME
, dengan SERVICE_NAME adalah nama layanan API Gateway Anda, yang telah Anda konfigurasi di kolomhost
dokumen OpenAPI Anda.Tambahkan bagian
security
di tingkat teratas file (tidak diindentasi atau disarangkan) untuk diterapkan ke seluruh API, atau di tingkat metode untuk diterapkan ke metode tertentu. Jika Anda menggunakan bagiansecurity
di tingkat API dan tingkat metode, setelan tingkat metode akan menggantikan setelan tingkat API.security: - DEFINITION_NAME: []
- Ganti
DEFINITION_NAME
dengan nama yang Anda gunakan di bagiansecurityDefinitions
. Jika Anda memiliki lebih dari satu definisi di bagian
securityDefinitions
, tambahkan di bagiansecurity
, misalnya:security: - service-1: [] - service-2: []
- Ganti
Deploy konfigurasi API yang diperbarui.
Sebelum meneruskan permintaan ke API Anda, API Gateway memverifikasi:
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI yang ditentukan di kolom
x-google-jwks_uri
dalam konfigurasi API Anda. - Klaim
"iss"
(penerbit) di JWT cocok dengan nilai yang ditentukan di kolomx-google-issuer
. - Klaim
"aud"
(audiens) di JWT berisi nama layanan API Gateway Anda atau cocok dengan salah satu nilai yang Anda tentukan di kolomx-google-audiences
. - Token belum habis masa berlakunya dengan menggunakan klaim
"exp"
(waktu habis masa berlaku).
Untuk mengetahui informasi selengkapnya tentang x-google-issuer
, x-google-jwks_uri
, dan
x-google-audiences
, lihat Ekstensi OpenAPI.
Membuat permintaan yang diautentikasi ke API Gateway API
Untuk membuat permintaan yang diautentikasi, layanan panggilan mengirimkan JWT yang ditandatangani oleh akun layanan yang Anda tentukan dalam konfigurasi API. Layanan panggilan harus:
- Buat JWT dan tandatangani dengan kunci pribadi akun layanan.
- Kirim JWT yang ditandatangani dalam permintaan ke API.
Contoh kode berikut menunjukkan proses ini untuk bahasa tertentu. Untuk membuat permintaan yang diautentikasi dalam bahasa lain, lihat jwt.io untuk mengetahui daftar library yang didukung.
-
Di layanan panggilan, tambahkan fungsi berikut dan teruskan parameter berikut:
Java -
saKeyfile
: Jalur lengkap ke file kunci pribadi akun layanan. -
saEmail
: Alamat email akun layanan. -
audience
: Jika Anda menambahkan kolomx-google-audiences
ke konfigurasi API, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah nama layanan API Gateway Anda. -
expiryLength
: Waktu habis masa berlaku JWT, dalam detik.
Python -
sa_keyfile
: Jalur lengkap ke file kunci pribadi akun layanan. -
sa_email
: Alamat email akun layanan. -
audience
: Jika Anda menambahkan kolomx-google-audiences
ke konfigurasi API, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah nama layanan API Gateway Anda. -
expiry_length
: Waktu habis masa berlaku JWT, dalam detik.
Mulai -
saKeyfile
: Jalur lengkap ke file kunci pribadi akun layanan. -
saEmail
: Alamat email akun layanan. -
audience
: Jika Anda menambahkan kolomx-google-audiences
ke konfigurasi API, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah nama layanan API Gateway Anda. -
expiryLength
: Waktu habis masa berlaku JWT, dalam detik.
Fungsi ini membuat JWT, menandatanganinya menggunakan file kunci pribadi, dan mengembalikan JWT yang ditandatangani.
Java Python Mulai -
-
Di layanan panggilan, tambahkan fungsi berikut untuk mengirim JWT yang ditandatangani di header
Authorization: Bearer
dalam permintaan ke API:Java Python Mulai
Saat Anda mengirim permintaan menggunakan JWT, demi alasan keamanan, sebaiknya Anda menempatkan token autentikasi di header Authorization: Bearer
. Contoh:
curl --request POST \ --header "Authorization: Bearer ${TOKEN}" \ "${GATEWAY_URL}/echo"
dengan GATEWAY_URL
dan TOKEN
adalah variabel lingkungan yang masing-masing berisi URL gateway yang di-deploy dan token autentikasi Anda.
Menerima hasil yang diautentikasi di API Anda
API Gateway biasanya meneruskan semua header yang diterimanya. Namun, header Authorization
asli akan diganti jika alamat backend ditentukan oleh x-google-backend
dalam konfigurasi API.
API Gateway akan mengirimkan hasil autentikasi di X-Apigateway-Api-Userinfo
ke backend API. Sebaiknya gunakan header ini, bukan header
Authorization
yang asli. Header ini dienkode base64url
dan berisi
payload JWT.