Autentikasi untuk pemanggilan
Untuk memanggil Cloud Function yang diautentikasi, akun utama pokok harus memenuhi persyaratan berikut:
- Memiliki izin untuk memanggil fungsi.
- Berikan token ID saat fungsi memanggil fungsi.
Apa yang dimaksud dengan akun utama? Seperti yang dijelaskan dalam artikel Mengamankan Cloud Functions, Cloud Functions mendukung dua jenis identitas yang berbeda, yang juga disebut sebagai akun utama:
- Akun layanan: Ini adalah akun khusus yang berfungsi sebagai identitas non-orang, seperti fungsi, aplikasi, atau VM. Mereka memberi Anda cara untuk mengotentikasi non-orang tersebut.
- Akun pengguna: Akun ini mewakili orang, baik sebagai pemegang Akun Google perorangan atau sebagai bagian dari entitas yang dikontrol Google seperti Grup Google.
Lihat ringkasan IAM untuk mempelajari lebih lanjut konsep IAM dasar.
Untuk memanggil Cloud Function yang diautentikasi, akun utama harus memiliki izin IAM invoker:
cloudfunctions.functions.invoke
untuk fungsi generasi ke-1. Ini biasanya dilakukan melalui peran Cloud Functions Invoker.run.routes.invoke
untuk fungsi generasi ke-2. Ini biasanya melalui peran Cloud Run Invoker. Izin ini harus ditetapkan pada resource layanan Cloud Run.
Untuk memberikan izin ini, gunakan perintah add-invoker-policy-binding
, seperti yang ditunjukkan dalam Mengautentikasi fungsi ke panggilan fungsi.
Agar izin dapat membuat, memperbarui, atau melakukan tindakan administratif lainnya pada fungsi, akun utama harus memiliki peran yang sesuai. Peran mencakup izin yang menentukan tindakan yang boleh dilakukan akun utama. Lihat Menggunakan IAM untuk Mengizinkan Akses untuk mengetahui informasi selengkapnya.
Memanggil fungsi dapat memiliki kompleksitas tambahan. Fungsi berbasis peristiwa hanya dapat dipanggil oleh sumber peristiwa langganannya, 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 menyediakan 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 contoh autentikasi yang berbeda untuk 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 berikut:
Tetapkan peran ke akun pengguna Cloud Functions Anda yang berisi izin pemanggilan.
cloudfunctions.functions.invoke
untuk fungsi generasi ke-1. Ini biasanya melalui peran Cloud Functions Invoker. Secara default, peran Cloud Functions Admin dan Cloud Functions Developer memiliki izin ini. Lihat Peran IAM Cloud Functions untuk mengetahui daftar lengkap peran dan izin terkait.run.routes.invoke
untuk fungsi generasi ke-2. Ini biasanya melalui peran Cloud Run Invoker.
Jika Anda bekerja dari komputer lokal, siapkan akses command line dengan melakukan inisialisasi Google Cloud CLI.
Berikan kredensial autentikasi sebagai token ID yang dibuat Google yang disimpan di header
Authorization
pada permintaan Anda. Misalnya, dapatkan token ID menggunakangcloud
dengan 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 Functions di Google Cloud Console atau dengan menjalankan perintah
gcloud functions describe
seperti yang ditunjukkan pada langkah pertama dalam contoh perintah deployment Google Cloud CLI.
Anda dapat menggunakan token yang dibuat oleh gcloud
untuk memanggil fungsi HTTP di project apa pun selama akun Anda memiliki izin cloudfunctions.functions.invoke
pada fungsi yang sedang dipanggil. Untuk tujuan pengembangan, gunakan token ID yang dihasilkan gcloud
. Namun, perlu diperhatikan bahwa token tersebut tidak memiliki klaim audiens, sehingga rentan terhadap serangan relai. Dalam lingkungan produksi, gunakan token ID yang dikeluarkan untuk akun layanan dengan audiens yang sesuai yang ditentukan. Pendekatan ini meningkatkan keamanan dengan membatasi penggunaan token
hanya untuk layanan yang dimaksudkan.
Seperti biasa, sebaiknya alokasikan kumpulan izin minimum yang diperlukan untuk mengembangkan dan menggunakan fungsi Anda. Pastikan kebijakan IAM pada fungsi Anda dibatasi untuk jumlah minimum pengguna dan akun layanan.
Contoh 2: Mengautentikasi fungsi ke panggilan fungsi
Saat membuat layanan yang menghubungkan beberapa fungsi, sebaiknya pastikan bahwa 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. Untuk fungsi generasi ke-1, peran invoker adalah Cloud Functions Invoker (roles/cloudfunctions.invoker
). Untuk fungsi generasi ke-2, peran invoker adalah Cloud Run Invoker (roles/run.invoker
) dan harus diberikan
pada layanan yang mendasarinya.
Cloud Functions (generasi ke-1)
Konsol
Untuk fungsi generasi ke-1, Anda menggunakan Cloud Functions Invoker:
Buka Konsol Google Cloud:
Klik kotak centang di samping fungsi penerima. (Jangan klik fungsi itu sendiri.)
Klik Izin di bagian atas layar. Panel Izin akan terbuka.
Klik Tambahkan akun utama.
Di kolom Akun utama baru, masukkan identitas fungsi pemanggil. Harus berupa email akun layanan.
Pilih peran Cloud Functions > Cloud Functions Invoker dari menu drop-down Pilih peran.
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 (utama) yang ditentukan untuk memanggil fungsi yang ditentukan. Google Cloud CLI akan otomatis mendeteksi pembuatan fungsi dan menambahkan peran Invoker yang tepat (cloudfunctions.invoker
untuk generasi ke-1 dan run.invoker
untuk generasi ke-2).
Ganti kode berikut:
RECEIVING_FUNCTION
: Nama fungsi penerimaan.CALLING_FUNCTION_IDENTITY
: Identitas fungsi panggilan, email akun layanan.
Cloud Functions (generasi ke-2)
Konsol
Untuk fungsi generasi ke-2, Anda menggunakan Cloud Run Invoker:
Buka Konsol Google Cloud:
Dalam daftar layanan Cloud Run, klik kotak centang di samping fungsi penerima. (Jangan klik fungsi itu sendiri.)
Panel Izin akan terbuka.
Klik Tambahkan akun utama.
Masukkan identitas layanan panggilan. Biasanya berupa alamat email, secara default
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.Perlu diperhatikan bahwa nomor project berbeda dengan project ID dan nama project. Anda dapat menemukan nomor project di halaman Dasbor Konsol Google Cloud.
Pilih peran
Cloud Run Invoker
dari opsi Pilih peran di menu drop-down.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 (utama) yang ditentukan untuk memanggil fungsi yang ditentukan. Google Cloud CLI akan otomatis mendeteksi pembuatan fungsi dan menambahkan peran Invoker yang tepat (cloudfunctions.invoker
untuk generasi ke-1 dan run.invoker
untuk generasi ke-2).
Ganti kode berikut:
RECEIVING_FUNCTION
: Nama fungsi penerimaan.CALLING_FUNCTION_IDENTITY
: Identitas fungsi panggilan, 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_TOKEN
dalam 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 untuk membuat token ID yang diperlukan akun utama untuk memanggil fungsi.
Akses yang tidak diautentikasi tanpa token ID dapat dilakukan, tetapi harus diaktifkan. Lihat Menggunakan IAM untuk Memberikan Otorisasi pada Akses untuk mengetahui informasi selengkapnya.
Membuat token secara terprogram
Setelah kode berikut menghasilkan token ID, kode akan memanggil Cloud Function 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 karena alasan tertentu Anda tidak dapat menggunakan library autentikasi, ada dua cara untuk mendapatkan token ID secara manual, baik dengan menggunakanServer metadata komputasi atau dengan membuat JWT yang ditandatangani sendiri dan 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 Melakukan autentikasi pengujian developer di atas.
Tukar JWT yang ditandatangani sendiri dengan token ID yang ditandatangani Google
Berikan peran Invoker Cloud Functions (
roles/cloudfunctions.invoker
) ke akun layanan dari fungsi yang memanggil 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_audience
yang ditetapkan ke URL fungsi penerima, serta klaimiss
dansub
yang ditetapkan ke alamat email akun layanan yang digunakan di atas. Ini juga harus menyertakan klaimexp
daniat
. Klaimaud
harus 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-urlencoded
Di bagian isi:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWT
Ganti
$JWT
dengan JWT yang baru saja Anda buatTindakan ini akan menampilkan JWT lain yang menyertakan
id_token
yang ditandatangani oleh Google.
Kirim permintaan GET/POST Anda ke fungsi penerimaan. Sertakan token ID yang ditandatangani Google di header Authorization: Bearer ID_TOKEN_JWT
dalam permintaan.
Langkah selanjutnya
Pelajari cara mengelola akses ke fungsi.
Dapatkan bantuan terkait cara lain untuk menghasilkan token ID.