Selain mengautentikasi pengguna, Anda mungkin perlu mengizinkan layanan lain berinteraksi dengan API Anda. Meskipun aplikasi klien dapat memberikan perintah login web kepada pengguna untuk mengirimkan kredensial mereka, Anda memerlukan pendekatan lain untuk komunikasi layanan-ke-layanan yang aman. Halaman ini menunjukkan pendekatan yang kami rekomendasikan untuk menerapkan autentikasi antar-layanan dan menyediakan kode contoh.
Ringkasan
Untuk mengidentifikasi layanan yang mengirim permintaan ke API Anda, gunakan a akun layanan. Layanan panggilan menggunakan kunci pribadi akun layanan untuk menandatangani Token Web JSON (JWT) yang aman dan mengirim JWT yang ditandatangani dalam permintaan ke API Anda.
Untuk menerapkan autentikasi layanan-ke-layanan di API dan layanan panggilan Anda:
- Buat akun layanan dan kunci untuk digunakan oleh layanan panggilan.
- Tambahkan dukungan untuk autentikasi dalam dokumen OpenAPI untuk layanan Cloud Endpoints Anda.
Tambahkan kode ke layanan panggilan yang:
- Membuat JWT dan menandatanganinya dengan kunci pribadi akun layanan.
- Mengirim JWT yang ditandatangani dalam permintaan ke API.
ESP memvalidasi bahwa klaim dalam JWT cocok dengan konfigurasi dalam dokumen OpenAPI Anda sebelum meneruskan permintaan ke API Anda. ESP 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 layanan panggilan untuk menandatangani JWT. Jika Anda memiliki lebih dari satu layanan yang mengirim permintaan ke API Anda, Anda dapat membuat satu akun layanan untuk mewakili semua layanan panggilan. Jika Anda perlu membedakan antara 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 Google Cloud konsol dan alat command line gcloud
`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 dan kunci:
Google Cloud Konsol
Buat akun layanan:
Di Google Cloud konsol, buka halaman Buat akun layanan.
Pilih project yang ingin Anda gunakan.
Di kolom Nama akun layanan, masukkan nama.
Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
Klik Create.
Klik Done.
Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.
Buat kunci akun layanan:
- Di Google Cloud konsol, klik alamat email untuk akun layanan yang telah dibuat.
- Klik Keys.
- Klik Tambahkan kunci, lalu Buat kunci baru.
- Klik Create. File JSON yang berisi kunci pribadi akun layanan akan didownload ke komputer Anda.
- Klik Close.
gcloud
Anda dapat menjalankan perintah berikut menggunakan Google Cloud CLI di komputer lokal, atau 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 loginTampilkan project ID untukproject Google Cloud Anda.
gcloud projects listTetapkan project default. Ganti
PROJECT_IDdengan project ID Google Cloud yang ingin Anda gunakan.gcloud config set project PROJECT_ID
Buat akun layanan. Ganti
SA_NAMEdanSA_DISPLAY_NAMEdengan 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 listTambahkan peran Service Account Token Creator. Ganti
SA_EMAIL_ADDRESSdengan 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_NAMEdengan nama yang ingin Anda gunakan untuk file kunci. Secara default, perintahgcloudmembuat 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 melindungi kunci pribadi, lihat Praktik terbaik untuk mengelola kredensial.
Mengonfigurasi API untuk mendukung autentikasi
Untuk mengaktifkan autentikasi akun layanan untuk layanan yang memanggil gateway Anda, ubah objek keamanan dalam dokumen OpenAPI Anda agar ESP dapat memvalidasi klaim dalam JWT yang ditandatangani. Perubahan akan bervariasi berdasarkan versi spesifikasi OpenAPI yang digunakan.
OpenAPI 2.0
- Tambahkan akun layanan sebagai penerbit dalam spesifikasi OpenAPI 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_NAMEdengan string yang mengidentifikasi definisi keamanan ini. Anda mungkin ingin menggantinya dengan nama akun layanan atau nama yang mengidentifikasi layanan panggilan. - Ganti
SA_EMAIL_ADDRESSdengan alamat email akun layanan. - Anda dapat menentukan beberapa definisi keamanan dalam spesifikasi OpenAPI, tetapi
setiap definisi harus memiliki
x-google-issueryang berbeda. Jika 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." x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345." service-2: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-2@example-project-12345." x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345."
- Ganti
- Secara opsional, tambahkan
x-google-audienceske bagiansecurityDefinitions. Jika Anda tidak menambahkanx-google-audiences, ESP mengharuskan klaim"aud"(audiens) dalam JWT berada dalam formathttps://SERVICE_NAME, dengan SERVICE_NAME adalah nama layanan ESP Anda, yang telah Anda konfigurasi di kolomhostdokumen OpenAPI Anda. - Tambahkan bagian
securitydi tingkat atas file (tidak diindentasi atau disarangkan) untuk diterapkan ke seluruh API, atau di tingkat metode untuk diterapkan ke metode tertentu. Jika Anda menggunakansecuritybagian di tingkat API dan di tingkat metode, setelan tingkat metode akan mengganti setelan tingkat API.security: - DEFINITION_NAME: []
- Ganti
DEFINITION_NAMEdengan nama yang Anda gunakan di bagiansecurityDefinitionssection. - Jika Anda memiliki lebih dari satu definisi di bagian
securityDefinitions, tambahkan definisi tersebut di bagiansecurity, misalnya:security: - service-1: [] - service-2: []
- Ganti
- Deploy spesifikasi OpenAPI yang telah diupdate . Sebelum ESP meneruskan permintaan ke API Anda, ESP akan memverifikasi:
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI
ditentukan dalam kolom
x-google-jwks_uridalam spesifikasi OpenAPI Anda. - Klaim
"iss"(penerbit) dalam JWT cocok dengan nilai yang ditentukan dalamx-google-issuerkolom. - Klaim
"aud"(audiens) dalam JWT berisi nama layanan ESP Anda atau cocok dengan salah satu nilai yang Anda tentukan di kolomx-google-audiences. - Token tidak berlaku lagi menggunakan klaim
"exp"(waktu habis masa berlaku).
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI
ditentukan dalam kolom
OpenAPI 3.x
- Tambahkan akun layanan sebagai penerbit dalam spesifikasi OpenAPI Anda:
components: securitySchemes: SCHEME_NAME: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: SA_EMAIL_ADDRESS jwksUri: https://www.googleapis.com/robot/v1/metadata/x509/SA_EMAIL_ADDRESS audiences: - 848149964201.apps.googleusercontent.com - 841077041629.apps.googleusercontent.com jwtLocations: - header: Authorization valuePrefix: "Bearer " security: - SCHEME_NAME: []
- Ganti
SCHEME_NAMEdengan string yang mengidentifikasi skema keamanan ini. Anda mungkin ingin menggantinya dengan nama akun layanan atau nama yang mengidentifikasi layanan panggilan. - Ganti
SA_EMAIL_ADDRESSdengan alamat email akun layanan. - Anda dapat menentukan beberapa skema keamanan dalam spesifikasi OpenAPI, tetapi
setiap definisi harus memiliki
issueryang berbeda. Jika telah membuat akun layanan terpisah untuk setiap layanan panggilan, Anda dapat membuat definisi keamanan untuk setiap akun layanan, misalnya:components: securitySchemes: service-1: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "service-1@example-project-12345." jwksUri: https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345. jwtLocations: - header: Authorization valuePrefix: "Bearer " service-2: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "service-2@example-project-12345." jwksUri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345." jwtLocations: - header: Authorization valuePrefix: "Bearer "
- Ganti
- Secara opsional, tambahkan
audienceske bagiansecuritySchemes. Jika Anda tidak menambahkanaudiences, ESP mengharuskan klaim"aud"(audiens) dalam JWT berada dalam formathttps://SERVICE_NAME, dengan SERVICE_NAME adalah nama layanan ESP Anda, yang telah Anda konfigurasi di kolomhostdokumen OpenAPI Anda. - Tambahkan bagian
securitydi tingkat atas file (tidak diindentasi atau disarangkan) untuk diterapkan ke seluruh API, atau di tingkat metode untuk diterapkan ke metode tertentu. Jika Anda menggunakansecuritybagian di tingkat API dan di tingkat metode, setelan tingkat metode akan mengganti setelan tingkat API.security: - SCHEME_NAME: []
- Ganti SCHEME_NAME dengan nama yang Anda
gunakan di bagian
securitySchemessection. - Jika Anda memiliki lebih dari satu definisi di bagian
securitySchemes, tambahkan definisi tersebut di bagiansecurity, misalnya:security: - service-1: [] - service-2: []
- Ganti SCHEME_NAME dengan nama yang Anda
gunakan di bagian
- Deploy spesifikasi OpenAPI yang telah diupdate . Sebelum ESP meneruskan permintaan ke API Anda, ESP akan memverifikasi:
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI
ditentukan dalam
jwksUridalam spesifikasi OpenAPI Anda. - Klaim
"iss"(penerbit) dalam JWT cocok dengan nilai yang ditentukan dalamissuerkolom. - Klaim
"aud"(audiens) dalam JWT berisi nama layanan ESP Anda atau cocok dengan salah satu nilai yang Anda tentukan di kolomaudiences. - Token tidak berlaku lagi menggunakan klaim
"exp"(waktu habis masa berlaku).
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI
ditentukan dalam
Membuat permintaan yang diautentikasi ke Endpoints API
Untuk membuat permintaan yang diautentikasi, layanan panggilan mengirim JWT yang ditandatangani oleh akun layanan yang Anda tentukan dalam dokumen OpenAPI. Layanan panggilan harus:
- Membuat JWT dan menandatanganinya dengan kunci pribadi akun layanan.
- Mengirim JWT yang ditandatangani dalam permintaan ke API.
Kode contoh 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:
parameter:
Java -
saKeyfile: Jalur lengkap ke file kunci pribadi akun layanan. -
saEmail: Alamat email akun layanan. -
audience: Jika Anda menambahkan kolomx-google-audienceske dokumen OpenAPI, tetapkanaudienceke salah satu nilai yang Anda tentukan untukx-google-audiences. Jika tidak, tetapkanaudiencekehttps://SERVICE_NAME, denganSERVICE_NAMEadalah nama layanan Endpoints 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-audienceske dokumen OpenAPI, tetapkanaudienceke salah satu nilai yang Anda tentukan untukx-google-audiences. Jika tidak, tetapkanaudiencekehttps://SERVICE_NAME, denganSERVICE_NAMEadalah nama layanan Endpoints Anda. -
expiry_length: Waktu habis masa berlaku JWT, dalam detik.
Go -
saKeyfile: Jalur lengkap ke file kunci pribadi akun layanan. -
saEmail: Alamat email akun layanan. -
audience: Jika Anda menambahkan kolomx-google-audienceske dokumen OpenAPI, tetapkanaudienceke salah satu nilai yang Anda tentukan untukx-google-audiences. Jika tidak, tetapkanaudiencekehttps://SERVICE_NAME, denganSERVICE_NAMEadalah nama layanan Endpoints Anda. -
expiryLength: Waktu habis masa berlaku JWT, dalam detik.
Fungsi ini membuat JWT, menandatanganinya menggunakan file kunci pribadi, dan menampilkan JWT yang ditandatangani.
Java Python Go -
-
Di layanan panggilan, tambahkan fungsi berikut untuk mengirim JWT yang ditandatangani
di header
Authorization: Bearerdalam permintaan ke API:Java Python Go
Saat Anda mengirim permintaan menggunakan JWT, karena alasan keamanan, sebaiknya letakkan token autentikasi di header Authorization: Bearer. Contoh:
curl --request POST \
--header "Authorization: Bearer ${TOKEN}" \
"${ENDPOINTS_HOST}/echo"
dengan ENDPOINTS_HOST dan TOKEN adalah variabel lingkungan yang berisi nama host API dan token autentikasi Anda.
Menerima hasil yang diautentikasi di API Anda
ESP biasanya meneruskan semua header yang diterimanya. Namun, ESP akan mengganti header Authorization asli saat alamat backend ditentukan oleh x-google-backend dalam spesifikasi OpenAPI atau BackendRule dalam konfigurasi layanan gRPC.
ESP akan mengirim hasil autentikasi di X-Endpoint-API-UserInfo ke backend API. Sebaiknya gunakan header ini, bukan header Authorization asli. Header ini adalah string yang base64url mengenkode objek JSON. Format objek JSON berbeda antara ESPv2 dan ESP.
Untuk ESPv2, objek JSON persis sama dengan payload JWT asli. Untuk ESP,
objek JSON menggunakan nama kolom yang berbeda dan menempatkan payload JWT asli di kolom claims.
Lihat Menangani JWT di layanan backend
untuk mengetahui informasi selengkapnya tentang format.