Selain mengautentikasi pengguna, Anda mungkin perlu mengizinkan layanan lain untuk 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 memberikan kode contoh.
Ringkasan
Untuk mengidentifikasi layanan yang mengirim permintaan ke API, 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 antarlayanan 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 di 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 memiliki lebih dari satu layanan yang mengirim permintaan ke API, 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 konsol Google Cloud dan alat command line gcloud
untuk membuat akun layanan dan file kunci pribadi serta untuk menetapkan peran Service Account Token Creator kepada akun layanan. Untuk informasi tentang cara menggunakan API untuk melakukan tugas ini, lihat
Membuat dan mengelola akun layanan.
Untuk membuat kunci dan akun layanan:
Konsol Google Cloud
Buat akun layanan:
Di konsol Google Cloud, buka halaman Create service account.
Pilih project yang ingin Anda gunakan.
Di kolom Nama akun layanan, masukkan nama.
Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
Klik Create.
Klik kolom Pilih peran. Di bagian Semua peran, pilih Akun Layanan > Pembuat Token Akun Layanan.
Klik Done.
Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.
Membuat kunci akun layanan:
- Di konsol Google Cloud, klik alamat email untuk akun layanan yang telah Anda buat.
- Klik Kunci.
- 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 dalam project Google Cloud yang ingin Anda gunakan.gcloud auth login
Menampilkan project ID untuk project Google Cloud Anda.
gcloud projects list
Tetapkan project default. Ganti
PROJECT_ID
dengan project ID Google Cloud 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"
Menampilkan 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 informasi tentang cara mengamankan kunci pribadi, lihat Praktik terbaik untuk mengelola kredensial.
Mengonfigurasi API untuk mendukung autentikasi
Anda harus memiliki objek persyaratan keamanan dan objek definisi keamanan dalam dokumen OpenAPI agar ESP dapat memvalidasi klaim dalam JWT yang ditandatangani.
Tambahkan akun layanan sebagai penerbit di dokumen 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_NAME
dengan string yang mengidentifikasi definisi keamanan ini. Anda dapat 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 dokumen OpenAPI, tetapi setiap definisi harus memiliki
x-google-issuer
yang 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.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
, ESP mewajibkan klaim"aud"
(audiens) dalam JWT dalam formathttps://SERVICE_NAME
, dengan SERVICE_NAME adalah nama layanan Endpoints, yang telah Anda konfigurasikan di kolomhost
dokumen OpenAPI, kecuali jika tanda--disable_jwt_audience_service_name_check
digunakan. Jika flag digunakan danx-google-audiences
tidak ditentukan, kolomaud
JWT tidak dicentang.Secara opsional, tambahkan
x-google-jwt-locations
ke bagiansecurityDefinitions
. Anda dapat menggunakan nilai ini untuk menentukan lokasi JWT kustom. Lokasi JWT default adalah headerAuthorization
(diawali dengan "Bearer "), headerX-Goog-Iap-Jwt-Assertion
, atau parameter kueriaccess_token
. Catatan:- Jika Anda menentukan
x-google-jwt-locations
, Endpoints akan mengabaikan semua lokasi default. x-google-jwt-locations
hanya didukung oleh ESPv2.
- Jika Anda menentukan
Tambahkan bagian
security
di tingkat atas file (tidak diindentasi atau bertingkat) untuk diterapkan ke seluruh API, atau di tingkat metode untuk diterapkan ke metode tertentu. Jika Anda menggunakan bagiansecurity
di tingkat API dan di 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 dokumen OpenAPI yang telah diperbarui. Ganti
OPENAPI_DOC
dengan nama dokumen OpenAPI Anda.gcloud endpoints services deploy OPENAPI_DOC
Sebelum meneruskan permintaan ke API Anda, ESP akan memverifikasi:
- Tanda tangan JWT menggunakan kunci publik, yang terletak di URI
yang ditentukan di kolom
x-google-jwks_uri
dalam dokumen OpenAPI Anda. - Klaim
"iss"
(penerbit) di JWT cocok dengan nilai yang ditentukan di kolomx-google-issuer
. - Klaim
"aud"
(audiens) di JWT berisi nama layanan Endpoints Anda atau cocok dengan salah satu nilai yang Anda tentukan di kolomx-google-audiences
. - Bahwa masa berlaku token belum berakhir dengan menggunakan klaim
"exp"
(waktu habis masa berlaku).
Untuk informasi selengkapnya tentang x-google-issuer
, x-google-jwks_uri
,
x-google-audiences
, dan x-google-jwt-locations
, lihat ekstensi OpenAPI.
Membuat permintaan yang diautentikasi ke Endpoints API
Untuk membuat permintaan yang diautentikasi, layanan panggilan akan mengirim JWT yang ditandatangani oleh akun layanan yang Anda tentukan dalam dokumen OpenAPI. Layanan panggilan harus:
- Buat JWT dan tanda tangani 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 dokumen OpenAPI, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah 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-audiences
ke dokumen OpenAPI, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah 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-audiences
ke dokumen OpenAPI, tetapkanaudience
ke salah satu nilai yang Anda tentukan untukx-google-audiences
. Jika tidak, tetapkanaudience
kehttps://SERVICE_NAME
, denganSERVICE_NAME
adalah 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: Bearer
dalam permintaan ke API:Java Python Go
Saat Anda mengirim permintaan menggunakan JWT, demi keamanan, sebaiknya Anda meletakkan 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 masing-masing berisi nama host API dan token autentikasi Anda.
Menerima hasil yang diautentikasi di API Anda
ESP biasanya meneruskan semua header yang diterimanya. Namun, header ini akan mengganti header Authorization
asli saat alamat backend ditentukan oleh x-google-backend
dalam spesifikasi OpenAPI atau BackendRule
dalam konfigurasi layanan gRPC.
ESP akan mengirimkan hasil autentikasi di X-Endpoint-API-UserInfo
ke API backend. Sebaiknya gunakan header ini, bukan header
Authorization
asli. Header ini adalah string yang dienkode oleh base64url
objek JSON. Format objek JSON berbeda antara ESPv2 dan ESP.
Untuk ESPv2, objek JSON sama persis 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 formatnya.