Mengautentikasi pemanggilan (generasi ke-1)
Untuk memanggil fungsi Cloud Run yang diautentikasi, principal yang mendasarinya harus memenuhi persyaratan berikut:
- Memiliki izin untuk memanggil fungsi.
- Memberikan token ID saat memanggil fungsi.
Apa itu principal? Seperti yang dijelaskan dalam Mengamankan Cloud Run Functions Anda, Cloud Run Functions mendukung dua jenis identitas berbeda, yang juga disebut principal:
- Akun layanan: Ini adalah akun khusus yang berfungsi sebagai identitas non-orang, seperti fungsi atau aplikasi atau VM. Akun ini memberi Anda cara untuk mengautentikasi non-orang ini.
- Akun pengguna: Akun ini mewakili orang, baik sebagai pemegang Akun Google perorangan atau sebagai bagian dari entity yang dikontrol Google seperti Google Grup.
Lihat Ringkasan IAM untuk mempelajari lebih lanjut konsep dasar IAM.
Untuk memanggil fungsi Cloud Run yang diautentikasi, principal harus memiliki izin IAM invoker:
cloudfunctions.functions.invoke. Hal ini biasanya dilakukan melalui peran Invoker.
Untuk memberikan izin ini, gunakan perintah
add-invoker-policy-binding
seperti yang ditunjukkan di
Mengautentikasi panggilan fungsi ke fungsi.
Untuk izin membuat, mengupdate, atau melakukan tindakan administratif lainnya pada fungsi, principal harus memiliki peran yang sesuai. Peran mencakup izin yang menentukan tindakan yang boleh dilakukan principal. Untuk mengetahui informasi selengkapnya, lihat Menggunakan IAM untuk Mengizinkan Akses.
Pemanggilan fungsi dapat memiliki kompleksitas tambahan. Fungsi berbasis peristiwa hanya dapat dipanggil oleh sumber peristiwa tempat fungsi itu berlangganan, tetapi fungsi HTTP dapat dipanggil dengan berbagai jenis identitas, yang berasal dari berbagai tempat. Invoker mungkin adalah developer yang menguji fungsi, atau fungsi atau layanan lain yang ingin menggunakan fungsi tersebut. Secara default, identitas ini harus memberikan token ID dengan permintaan untuk mengautentikasi dirinya sendiri. Selain itu, akun yang digunakan juga harus telah diberikan izin yang sesuai.
Pelajari lebih lanjut cara membuat dan menggunakan token ID.
Contoh autentikasi
Bagian ini menunjukkan beberapa macam contoh untuk mengautentikasi pemanggilan.
Contoh 1: Mengautentikasi pengujian developer
Sebagai developer, Anda memerlukan akses untuk membuat, mengupdate, serta menghapus fungsi, dan akses ini diberikan melalui proses (IAM) normal.
Namun, sebagai developer, Anda mungkin perlu memanggil fungsi untuk
tujuan pengujian. Untuk memanggil fungsi menggunakan curl atau alat serupa, perhatikan hal-hal
berikut:
Tetapkan peran ke akun pengguna Cloud Run Functions Anda yang berisi izin pemanggilan.
cloudfunctions.functions.invoke. Hal ini biasanya dilakukan melalui peran Invoker. Secara default, peran Cloud Run Functions Admin dan Cloud Run Functions Developer memiliki izin ini. Lihat Peran IAM Cloud Run Functions untuk mengetahui daftar lengkap peran dan izin yang terkait.
Jika Anda bekerja dari komputer lokal, siapkan akses command line dengan melakukan inisialisasi Google Cloud CLI.
Berikan permintaan Anda dengan kredensial autentikasi sebagai token ID buatan Google yang disimpan di header
Authorization. Misalnya, dapatkan token ID menggunakangclouddengan menjalankan perintah berikut:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://FUNCTION_URL
dengan FUNCTION_URL adalah URL fungsi Anda. Ambil URL ini dari halaman Cloud Run Functions di konsolGoogle Cloud atau dengan menjalankan perintah
gcloud functions describeseperti yang ditunjukkan pada langkah pertama contoh perintah deployment Google Cloud CLI.
Anda dapat menggunakan token yang dibuat oleh gcloud untuk memanggil fungsi HTTP di
project mana pun, selama akun Anda memiliki izin cloudfunctions.functions.invoke
pada fungsi yang dipanggil. Untuk tujuan pengembangan, gunakan
token ID yang dibuat gcloud. Namun, ingatlah bahwa token tersebut tidak memiliki klaim audiens,
sehingga rentan terhadap serangan relai. Di lingkungan
produksi, gunakan token ID yang dikeluarkan untuk akun layanan dengan
audiens yang sesuai dan ditentukan. Pendekatan ini meningkatkan keamanan dengan membatasi penggunaan token
hanya untuk layanan yang dituju.
Seperti biasa, sebaiknya alokasikan kumpulan izin minimum yang diperlukan untuk mengembangkan dan menggunakan fungsi Anda. Pastikan kebijakan IAM pada fungsi Anda dibatasi untuk jumlah pengguna dan akun layanan minimum.
Contoh 2: Mengautentikasi fungsi ke panggilan fungsi
Saat membuat layanan yang menghubungkan beberapa fungsi, sebaiknya
pastikan setiap fungsi hanya dapat mengirim permintaan ke subset tertentu dari
fungsi Anda yang lain. Misalnya, jika Anda memiliki fungsi login, fungsi tersebut harus dapat
mengakses fungsi user profiles, tetapi mungkin tidak dapat
mengakses fungsi search.
Untuk mengonfigurasi fungsi penerima agar menerima permintaan dari fungsi panggilan
tertentu, Anda harus memberikan peran invoker yang sesuai ke akun layanan fungsi pemanggil
pada fungsi penerima. Peran
invoker adalah Cloud Run Functions Invoker (roles/cloudfunctions.invoker):
Konsol
Gunakan Cloud Run Functions Invoker:
Buka konsol Google Cloud :
Klik kotak centang di samping fungsi penerima. (Jangan mengklik fungsi.)
Klik Permissions di bagian atas layar. Panel Permissions akan terbuka.
Klik Add principal.
Di kolom New principals, masukkan identitas fungsi pemanggil. Identitas fungsi pemanggil ini harus berupa email akun layanan.
Pilih peran Cloud Functions > Cloud Functions Invoker dari menu drop-down Select a role.
Klik Save.
gcloud
Gunakan perintah gcloud functions add-invoker-policy-binding:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
Perintah add-invoker-policy-binding
menambahkan binding kebijakan IAM peran invoker
yang memungkinkan anggota (principal) yang ditentukan memanggil
fungsi yang ditentukan. Google Cloud CLI otomatis mendeteksi pembuatan fungsi dan
menambahkan peran Invoker yang benar (cloudfunctions.invoker untuk generasi ke-1).
Ganti kode berikut:
RECEIVING_FUNCTION: Nama fungsi penerima.CALLING_FUNCTION_IDENTITY: Identitas fungsi pemanggil, email akun layanan.
Karena akan memanggil fungsi penerima, fungsi pemanggil juga harus menyediakan token ID yang ditandatangani Google untuk melakukan autentikasi. Proses ini terdiri dari dua langkah:
Buat token ID yang ditandatangani Google dengan kolom audience (
aud) yang ditetapkan ke URL fungsi penerima.Sertakan token ID di header
Authorization: Bearer ID_TOKENdalam permintaan ke fungsi.
Sejauh ini, cara termudah dan paling andal untuk mengelola proses ini adalah dengan menggunakan library autentikasi, seperti yang ditunjukkan di bawah, untuk membuat dan menggunakan token ini.
Membuat token ID
Bagian ini menjelaskan berbagai cara membuat token ID yang diperlukan principal untuk memanggil fungsi.
Akses yang tidak diautentikasi tanpa token ID dapat dilakukan, tetapi harus diaktifkan. Untuk mengetahui informasi selengkapnya, lihat Menggunakan IAM untuk Mengizinkan Akses.
Membuat token secara terprogram
Setelah kode berikut menghasilkan token ID, kode akan memanggil fungsi Cloud Run Anda dengan token tersebut atas nama Anda. Kode ini berfungsi di lingkungan apa pun tempat library dapat memperoleh kredensial autentikasi, termasuk lingkungan yang mendukung Kredensial Default Aplikasi lokal.
Node.js
Python
Go
Java
Membuat token secara manual
Jika Anda memanggil fungsi dan tidak dapat menggunakan library autentikasi karena alasan tertentu, ada dua cara untuk mendapatkan token ID secara manual, baik dengan menggunakan Server metadata komputasi atau dengan membuat JWT yang ditandatangani sendiri, lalu menukarnya dengan token ID yang ditandatangani Google.
Menggunakan server metadata
Anda dapat menggunakan server metadata Compute untuk mengambil token ID dengan audience tertentu sebagai berikut:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
-H "Metadata-Flavor: Google"
Ganti AUDIENCE dengan URL fungsi yang Anda panggil. Anda dapat mengambil URL ini seperti yang dijelaskan di bagian Mengautentikasi pengujian developer di atas.
Menukar JWT yang ditandatangani sendiri dengan token ID yang ditandatangani Google
Berikan peran Invoker (
roles/cloudfunctions.invoker) ke akun layanan fungsi pemanggil pada fungsi penerima.Buat akun layanan dan kunci, lalu download file dengan kunci pribadi (dalam format JSON) ke host tempat fungsi atau layanan pemanggil pembuat permintaan.
Buat JWT dengan header disetel ke
{"alg":"RS256","typ":"JWT"}. Payload harus menyertakan klaimtarget_audienceyang ditetapkan ke URL fungsi penerima, serta klaimissdansubyang ditetapkan ke alamat email akun layanan yang digunakan di atas. Payload juga harus menyertakan klaimexpdaniat. Klaimaudharus ditetapkan kehttps://www.googleapis.com/oauth2/v4/token.Gunakan kunci pribadi yang didownload di atas untuk menandatangani JWT.
Dengan JWT ini, kirim permintaan POST ke https://www.googleapis.com/oauth2/v4/token. Data autentikasi harus disertakan dalam header dan isi permintaan.
Di header:
Authorization: Bearer $JWT - where $JWT is the JWT you just created Content-Type: application/x-www-form-urlencodedDi bagian isi:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWTGanti
$JWTdengan JWT yang baru saja Anda buatTindakan ini akan menampilkan JWT lain yang menyertakan
id_tokenyang ditandatangani Google.
Kirim permintaan GET/POST Anda ke fungsi penerima. Sertakan token ID yang ditandatangani
Google di header Authorization: Bearer ID_TOKEN_JWT
dalam permintaan.
Langkah berikutnya
Pelajari cara mengelola akses ke fungsi.
Dapatkan bantuan terkait cara lain untuk menghasilkan token ID.