Anda dapat menerapkan autentikasi antarlayanan menggunakan akun layanan di layanan gRPC. Halaman ini menunjukkan autentikasi layanan ke layanan dengan membimbing Anda melalui contoh lengkap, termasuk cara mengonfigurasi Extensible Service Proxy (ESP) di layanan gRPC untuk mendukung permintaan yang diautentikasi dan cara memanggil layanan dari klien gRPC.
Agar layanan dapat melakukan panggilan yang diautentikasi ke Cloud Endpoints API, layanan panggilan harus memiliki akun layanan dan harus mengirim token autentikasi dalam panggilan. Pemanggil harus menggunakan
token ID Google
atau
Token Web JSON (JWT) kustom yang hanya ditandatangani
oleh akun layanan pemanggil. ESP memvalidasi bahwa
klaim iss
di JWT cocok dengan setelan issuer
dalam konfigurasi
layanan. ESP tidak memeriksa izin Identity and Access Management yang telah diberikan di akun layanan.
Dalam contoh ini, Anda menyiapkan dan menggunakan bentuk autentikasi layanan ke layanan yang paling sederhana, dengan klien menggunakan akun layanan Google Cloud mereka untuk membuat JWT autentikasi. Pendekatan untuk metode autentikasi lainnya serupa, meskipun proses sisi klien untuk mendapatkan token autentikasi yang valid bergantung pada metode autentikasi yang digunakan.
Sebelum memulai
Panduan ini menggunakan contoh Toko Buku yang digunakan dalam Tutorial kami.
Clone repo git tempat kode contoh gRPC dihosting:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Ubah direktori kerja Anda:
cd python-docs-samples/endpoints/bookstore-grpc/
Ikuti petunjuk di Tutorial untuk menyiapkan project jika Anda belum memilikinya.
Dalam contoh ini, Anda menggunakan deployment ke Google Kubernetes Engine, meskipun penyiapan autentikasi sama untuk Compute Engine.
Dalam contoh, ada dua project Google Cloud Platform yang direferensikan:
- Project produsen layanan, yang merupakan project yang memiliki layanan Cloud Endpoints for gRPC.
- Project konsumen layanan, yang merupakan project yang memiliki klien gRPC.
Membuat kunci dan akun layanan konsumen
Untuk membuat akun layanan dan kunci untuk project konsumen:
- Di konsol Google Cloud, buka API & layanan. Pastikan Anda berada di project konsumen.
- Di halaman Kredensial, pada menu drop-down Buat Kredensial, pilih Kunci Akun Layanan.
Di halaman Create service account key, jika Anda sudah memiliki akun layanan yang ingin digunakan, pilih akun tersebut. Jika tidak, di menu drop-down Service account, pilih New service account dan ketik nama akun.
ID Akun layanan yang sesuai akan dibuat untuk Anda. Catat ID karena diperlukan di bagian berikut. Contoh:
service-account-name@YOUR_PROJECT_ID.
Klik menu drop-down Peran, lalu pilih peran berikut:
- Akun Layanan > Service Account User
- Service Accounts > Service Account Token Creator
Pastikan jenis kunci JSON dipilih.
Klik Create. File kunci JSON akun layanan Anda didownload ke komputer lokal. Catat lokasinya dan pastikan disimpan dengan aman karena akan digunakan nanti untuk membuat token.
Mengonfigurasi autentikasi untuk layanan
Gunakan project produsen untuk semua langkah di bagian ini.
Menyiapkan autentikasi di konfigurasi gRPC API
Autentikasi untuk ESP dikonfigurasi di bagian authentication
file YAML konfigurasi gRPC API Anda. Konfigurasi dengan autentikasi untuk contoh layanan ini ada di api_config_auth.yaml
.
Bagian providers
menentukan penyedia autentikasi yang ingin Anda
gunakan - dalam hal ini, Anda ingin menggunakan akun layanan Google sebagai
penyedia autentikasi. Bagian rules
menentukan bahwa Anda memerlukan token
dari penyedia ini untuk mengakses semua metode layanan Anda.
Di salinan file ini dari repo yang di-clone:
- Ubah
MY_PROJECT_ID
menjadi ID project produser Anda. - Ubah
SERVICE-ACCOUNT-ID
di bagianauthentication
(baik dalam nilaiissuer
maupunjwks_uri
) menjadi ID akun layanan konsumen yang Anda catat di bagian sebelumnya. Tindakan ini memberi tahu ESP bahwa Anda ingin memberikan akses ke layanan kepada pengguna yang memberikan token yang valid dari akun layanan tertentu ini. - Secara opsional, tambahkan
jwt_locations
di bawah elemenproviders
. Anda dapat menggunakan nilai ini untuk menentukan lokasi JWT kustom. Lokasi JWT default adalah metadataAuthorization
(diawali dengan "Bearer ") dan metadataX-Goog-Iap-Jwt-Assertion
.
Simpan file untuk langkah berikutnya.
Men-deploy konfigurasi dan layanan
Langkah-langkah ini sama seperti dalam Memulai gRPC di GKE:
Deploy konfigurasi layanan ke Endpoint: Anda harus melakukannya meskipun telah melakukannya untuk tutorial, karena ini adalah konfigurasi yang berbeda. Perhatikan nama layanan yang ditampilkan:
gcloud endpoints services deploy api_descriptor.pb api_config_auth.yaml --project PRODUCER_PROJECT
Buat cluster penampung dan autentikasi
kubectl
ke cluster, jika Anda belum melakukannya.Men-deploy API dan ESP contoh ke cluster. Jika Anda menggunakan project produsen dan konsumen terpisah, pastikan terlebih dahulu bahwa Anda telah menetapkan project yang sesuai dalam alat baris perintah
gcloud
:gcloud config set project PRODUCER_PROJECT
Memanggil metode yang diautentikasi dari klien gRPC
Terakhir, di sisi klien, Anda dapat menggunakan kunci akun layanan untuk membuat
token JWT, lalu menggunakan token tersebut untuk memanggil metode Toko Buku yang diautentikasi.
Pertama, instal persyaratan Python yang sesuai untuk membuat token dan
menjalankan contoh klien. Pastikan Anda berada di
folder python-docs-samples/endpoints/bookstore-grpc
klien yang di-clone, lalu:
virtualenv bookstore-env
source bookstore-env/bin/activate
pip install -r requirements.txt
Membuat token JWT
Dalam contoh ini, Toko Buku menggunakan autentikasi layanan ke layanan dengan layanan panggilan diautentikasi sepenuhnya oleh akun layanannya, sehingga membuat token yang sesuai untuk dikirim dengan permintaan kita menjadi mudah. Perhatikan bahwa Anda juga dapat memerlukan autentikasi layanan ke layanan yang lebih ketat, dengan token yang dihasilkan harus diautentikasi lebih lanjut oleh Google (menggunakan token ID Google).
Untuk contoh ini, skrip Python yang disediakan dapat membuat token dari file kunci JSON yang didownload sebelumnya, menggunakan ID pengguna dan email palsu.
Untuk membuat token menggunakan skrip:
Buat token JWT dan tetapkan ke variabel
$JWT_TOKEN
:JWT_TOKEN=$(python jwt_token_gen.py \ --file=[SERVICE_ACCOUNT_FILE] \ --audiences=[SERVICE_NAME] \ --issuer=[SERVICE-ACCOUNT-ID])
dengan:
[SERVICE_ACCOUNT_FILE]
adalah file kunci JSON akun layanan konsumen yang didownload.[SERVICE_NAME]
adalah nama layanan Toko Buku yang ditampilkan saat Anda men-deploy konfigurasi layanan yang diperbarui ke Endpoint.[SERVICE-ACCOUNT-ID]
adalah ID akun layanan konsumen lengkap saat Anda membuat akun layanan.
Melakukan panggilan gRPC yang diautentikasi
Langkah terakhir ini menggunakan
bookstore_client.py
,
yang merupakan klien yang sama dengan yang digunakan dalam
Tutorial. Untuk melakukan panggilan yang diautentikasi, klien meneruskan JWT sebagai metadata dengan panggilan metodenya.
Untuk menjalankan contoh:
Gunakan
kubectl get services
untuk mendapatkan alamat IP eksternal untuk Bookstore yang di-deploy:#kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo 10.11.246.240 104.196.186.92 80/TCP 10d endpoints 10.11.243.168 104.196.210.50 80/TCP,8090/TCP 10d esp-grpc-bookstore 10.11.254.34 104.196.60.37 80/TCP 1d kubernetes 10.11.240.1 <none> 443/TCP 10d
Dalam hal ini, layanan tersebut adalah layanan
esp-grpc-bookstore
dan IP eksternalnya adalah104.196.60.37
.Tetapkan alamat IP ke variabel
EXTERNAL_IP
EXTERNAL_IP=104.196.60.37
Cantumkan semua rak dari layanan Toko Buku:
python bookstore_client.py --port=80 --host=$EXTERNAL_IP --auth_token=$JWT_TOKEN
Layanan ini menampilkan semua rak di Toko Buku saat ini. Anda dapat memeriksanya lagi dengan tidak memberikan token, atau dengan menentukan ID akun layanan yang salah saat membuat JWT. Perintah akan gagal.