Tujuan
Wajibkan pengguna aplikasi App Engine Anda untuk mengautentikasi diri mereka sendiri dengan menggunakan IAP.
Mengakses identitas pengguna di aplikasi untuk menampilkan alamat email yang diautentikasi milik pengguna saat ini.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Latar belakang
Tutorial ini menggunakan IAP untuk mengautentikasi pengguna. Ini hanyalah salah satu dari beberapa kemungkinan pendekatan. Untuk mempelajari berbagai metode autentikasi pengguna lebih lanjut, baca bagian Konsep autentikasi.
Aplikasi Hello user-email-address
Aplikasi untuk tutorial ini adalah aplikasi App Engine Halo dunia minimal, dengan satu fitur non-standar: aplikasi yang menampilkan "Hello user-email-address
", bukan "Halo dunia", dengan user-email-address
adalah alamat email pengguna yang telah diautentikasi.
Fungsi ini dapat dilakukan dengan memeriksa informasi terautentikasi yang ditambahkan IAP ke setiap permintaan web yang diteruskan ke aplikasi Anda. Ada tiga header permintaan baru yang ditambahkan ke setiap permintaan web yang mencapai aplikasi Anda. Dua header pertama adalah string teks biasa yang bisa digunakan untuk mengidentifikasi pengguna. Header ketiga adalah objek yang ditandatangani secara kriptografis dengan informasi yang sama tersebut.
X-Goog-Authenticated-User-Email
: Alamat email pengguna mengidentifikasi mereka. Jangan menyimpan informasi pribadi jika aplikasi Anda dapat menghindarinya. Aplikasi ini tidak menyimpan data apa pun; tetapi hanya mengulanginya kembali ke pengguna.X-Goog-Authenticated-User-Id
: ID pengguna yang ditetapkan oleh Google tidak menampilkan informasi tentang pengguna tersebut, tetapi memungkinkan aplikasi mengetahui bahwa pengguna yang login sama dengan yang terlihat sebelumnya.X-Goog-Iap-Jwt-Assertion
: Anda dapat mengonfigurasi aplikasi Google Cloud untuk menerima permintaan web dari aplikasi cloud lainnya, mengabaikan IAP, selain permintaan web internet. Jika aplikasi dikonfigurasi seperti itu, mungkin permintaan tersebut mungkin telah memalsukan header. Daripada menggunakan header teks biasa yang disebutkan sebelumnya, Anda dapat menggunakan dan memverifikasi header yang ditandatangani secara kriptografis ini untuk memeriksa apakah informasi tersebut diberikan oleh Google. Alamat email pengguna dan ID pengguna tetap tersedia sebagai bagian dari header bertanda tangan ini.
Jika Anda yakin bahwa aplikasi telah dikonfigurasi sehingga hanya permintaan web internet yang dapat menjangkaunya, dan tidak ada yang dapat menonaktifkan layanan IAP untuk aplikasi, mengambil ID pengguna unik hanya memerlukan satu baris kode:
$userId = getallheaders()['X-Goog-Authenticated-User-Id'] ?? null;
Namun, aplikasi yang tangguh akan mengalami error, seperti masalah konfigurasi atau lingkungan yang tidak terduga. Jadi, sebaiknya buat fungsi yang menggunakan dan memverifikasi header yang ditandatangani secara kriptografis. Tanda tangan header tersebut tidak dapat dipalsukan, dan jika diverifikasi, dapat digunakan untuk menampilkan identifikasi.
Membuat kode sumber
Gunakan editor teks untuk membuat file bernama
index.php
, dan tempelkan kode berikut di dalamnya:File
index.php
ini akan dijelaskan secara mendetail di bagian Memahami kode nanti dalam tutorial ini.Buat file lain bernama
composer.json
, dan tempelkan kode berikut ke dalamnya:File
composer.json
mencantumkan semua library PHP yang diperlukan aplikasi Anda untuk memuat App Engine:firebase/php-jwt
menyediakan fungsi pemeriksaan dan decoding JWT.guzzle/http
adalah klien HTTP untuk mengambil data dari situs.
Buat file bernama
app.yaml
dan masukkan teks berikut ke dalamnya:File
app.yaml
memberi tahu App Engine lingkungan bahasa yang diperlukan kode Anda.
Memahami kode
Bagian ini menjelaskan cara kerja kode di index.php
. Jika hanya ingin menjalankan aplikasi, Anda dapat langsung ke bagian Deploy aplikasi.
Kode berikut ada dalam file index.php
. Saat permintaan HTTP GET
ke halaman beranda diterima oleh aplikasi, kasus switch untuk /
akan dipanggil:
Pernyataan switch mendapatkan nilai header pernyataan JWT yang ditambahkan IAP dari permintaan masuk dan memanggil fungsi untuk memvalidasi nilai yang ditandatangani secara kriptografis tersebut. Nilai pertama yang ditampilkan (email) kemudian digunakan di halaman web minimal yang dibuat dan ditampilkan oleh nilai tersebut.
Fungsi validate_assertion
menggunakan library google/auth
untuk memverifikasi bahwa
pernyataan ditandatangani dengan benar dan untuk mengekstrak informasi payload dari
pernyataan. Jika pernyataan tidak dapat didekode, fungsi akan menampilkan pengecualian. Jika berhasil, fungsi tersebut akan menampilkan alamat email pengguna yang diautentikasi dan ID unik persisten untuk pengguna tersebut.
Untuk memvalidasi pernyataan JWT, Anda harus mengetahui sertifikat kunci publik dari entity yang menandatangani pernyataan (dalam hal ini Google), dan audiens yang menjadi tujuan pernyataan tersebut. Untuk aplikasi App Engine, audience adalah string yang berisi informasi identifikasi project Google Cloud di dalamnya. Fungsi ini mendapatkan sertifikat dan string audiens tersebut dari fungsi sebelumnya.
Anda dapat mencari ID numerik dan nama project Google Cloud, lalu memasukkannya sendiri dalam kode sumber. Namun, fungsi audience
akan melakukannya untuk Anda dengan membuat kueri layanan metadata standar yang disediakan untuk setiap aplikasi App Engine.
Layanan metadata App Engine (dan layanan metadata serupa untuk layanan Google Cloud computing lainnya) terlihat seperti situs dan dikueri oleh kueri web standar. Namun, ini sebenarnya bukan situs eksternal, melainkan fitur internal yang menampilkan informasi yang diminta tentang aplikasi yang sedang berjalan sehingga aman untuk menggunakan permintaan http
, bukan https
.
Atribut ini digunakan untuk mendapatkan ID Google Cloud saat ini yang diperlukan untuk menentukan audience yang dituju oleh pernyataan JWT.
Men-deploy aplikasi
Sekarang, Anda dapat men-deploy aplikasi, lalu mengaktifkan IAP untuk mewajibkan pengguna melakukan autentikasi sebelum mereka dapat mengakses aplikasi.
Di jendela terminal, buka direktori yang berisi file
app.yaml
, lalu deploy aplikasi ke App Engine:gcloud app deploy
Saat diminta, pilih wilayah terdekat.
Ketika ditanya apakah Anda ingin melanjutkan operasi deployment, masukkan
Y
.Dalam beberapa menit, aplikasi Anda akan aktif di internet.
Lihat aplikasi:
gcloud app browse
Di output, salin
web-site-url
, alamat web untuk aplikasi.Di jendela browser, tempel
web-site-url
untuk membuka aplikasi.Tidak ada email yang ditampilkan karena Anda belum menggunakan IAP, sehingga tidak ada informasi pengguna yang dikirim ke aplikasi.
Aktifkan IAP
Setelah instance App Engine ada, Anda dapat melindunginya dengan IAP:
Di konsol Google Cloud, buka halaman Identity-Aware Proxy.
Karena ini adalah pertama kalinya Anda mengaktifkan opsi autentikasi untuk project ini, Anda akan melihat pesan bahwa Anda harus mengonfigurasi layar izin OAuth sebelum dapat menggunakan IAP.
Klik Konfigurasi Layar Persetujuan.
Pada tab OAuth Consent Screen di halaman Credentials, lengkapi kolom berikut:
Jika akun Anda berada di organisasi Google Workspace, pilih External, lalu klik Create. Untuk memulai, aplikasi hanya akan tersedia untuk pengguna yang secara eksplisit Anda izinkan.
Di kolom Application name, masukkan
IAP Example
.Di kolom Email dukungan, masukkan alamat email Anda.
Di kolom Domain yang diotorisasi, masukkan bagian nama host URL aplikasi, misalnya,
iap-example-999999.uc.r.appspot.com
. Tekan tombolEnter
setelah memasukkan nama host di kolom.Di kolom Link halaman beranda aplikasi, masukkan URL untuk aplikasi Anda, misalnya,
https://iap-example-999999.uc.r.appspot.com/
.Di kolom Baris kebijakan privasi aplikasi, gunakan URL yang sama dengan link halaman beranda untuk tujuan pengujian.
Klik Simpan. Saat diminta membuat kredensial, Anda dapat menutup jendela.
Di konsol Google Cloud, buka halaman Identity-Aware Proxy.
Untuk memuat ulang halaman, klik Refresh refresh. Halaman ini menampilkan daftar resource yang dapat dilindungi.
Di kolom IAP, klik untuk mengaktifkan IAP untuk aplikasi.
Di browser Anda, buka
web-site-url
lagi.Sebagai ganti halaman web, ada layar login untuk mengautentikasi diri Anda. Saat login, akses Anda akan ditolak karena IAP tidak memiliki daftar pengguna yang diizinkan masuk ke aplikasi.
Menambahkan pengguna yang diberi otorisasi ke aplikasi
Di konsol Google Cloud, buka halaman Identity-Aware Proxy.
Centang kotak untuk aplikasi App Engine, lalu klik Add Principal.
Masukkan
allAuthenticatedUsers
, lalu pilih peran Cloud IAP/IAP-Secured Web App User.Klik Simpan.
Kini, setiap pengguna yang dapat diautentikasi oleh Google dapat mengakses aplikasi. Jika mau, Anda dapat membatasi akses lebih lanjut dengan hanya menambahkan satu atau beberapa orang atau grup sebagai akun utama:
Semua alamat email Gmail atau Google Workspace
Alamat email Google Grup
Nama domain Google Workspace
Mengakses aplikasi
Di browser Anda, buka
web-site-url
.Untuk memuat ulang halaman, klik Refresh refresh.
Di layar login, login dengan kredensial Google Anda.
Halaman tersebut akan menampilkan halaman "Halo
user-email-address
" dengan alamat email Anda.Jika Anda masih melihat halaman yang sama seperti sebelumnya, mungkin ada masalah dengan browser karena tidak sepenuhnya mengupdate permintaan baru setelah Anda mengaktifkan IAP. Tutup semua jendela browser, buka kembali, dan coba lagi.
Konsep otentikasi
Ada beberapa cara agar aplikasi dapat mengautentikasi penggunanya dan membatasi akses hanya untuk pengguna yang diotorisasi. Metode autentikasi umum, yang mengalami penurunan tingkat upaya untuk aplikasi, tercantum di bagian berikut.
Opsi | Kelebihan | Kekurangan |
---|---|---|
Autentikasi aplikasi |
|
|
OAuth2 |
|
|
IAP |
|
|
Autentikasi yang dikelola aplikasi
Dengan metode ini, aplikasi mengelola sendiri setiap aspek autentikasi pengguna. Aplikasi harus mengelola database kredensial pengguna sendiri dan mengelola sesi pengguna. Aplikasi juga harus menyediakan fungsi untuk mengelola akun dan sandi pengguna, memeriksa kredensial pengguna, serta menerbitkan, memeriksa, dan memperbarui sesi pengguna dengan setiap login yang diautentikasi. Diagram berikut mengilustrasikan metode autentikasi yang dikelola aplikasi.
Seperti yang ditunjukkan dalam diagram, setelah pengguna login, aplikasi akan membuat dan menyimpan informasi tentang sesi pengguna. Saat pengguna membuat permintaan ke aplikasi, permintaan tersebut harus menyertakan informasi sesi yang bertanggung jawab untuk diverifikasi oleh aplikasi.
Keuntungan utama dari pendekatan ini adalah bahwa pendekatan ini bersifat mandiri dan berada di bawah kontrol aplikasi. Aplikasi ini bahkan tidak perlu tersedia di internet. Kelemahan utamanya adalah aplikasi kini bertanggung jawab untuk menyediakan semua fungsi pengelolaan akun dan melindungi semua data kredensial yang sensitif.
Autentikasi eksternal dengan OAuth2
Alternatif yang baik untuk menangani semua hal dalam aplikasi adalah dengan menggunakan layanan identitas eksternal, seperti Google, yang menangani semua informasi dan fungsi akun pengguna dan bertanggung jawab untuk mengamankan kredensial sensitif. Saat pengguna mencoba login ke aplikasi, permintaan dialihkan ke layanan identitas, yang mengautentikasi pengguna, lalu mengalihkan permintaan kembali ke aplikasi dengan menyediakan informasi autentikasi yang diperlukan. Untuk informasi selengkapnya, lihat Menggunakan OAuth 2.0 untuk Aplikasi Server Web.
Diagram berikut mengilustrasikan autentikasi eksternal dengan metode OAuth2.
Alur dalam diagram dimulai saat pengguna mengirim permintaan untuk mengakses aplikasi. Aplikasi mengalihkan browser pengguna ke platform identitas Google, yang menampilkan halaman untuk login ke Google, bukan merespons secara langsung. Setelah berhasil login, browser pengguna akan diarahkan kembali ke aplikasi. Permintaan ini menyertakan informasi yang dapat digunakan aplikasi untuk mencari informasi tentang pengguna yang telah diautentikasi, dan aplikasi akan merespons pengguna.
Metode ini memiliki banyak keuntungan untuk aplikasi. Metode ini mendelegasikan semua fungsi pengelolaan akun dan risiko ke layanan eksternal, yang dapat meningkatkan keamanan login dan akun tanpa harus mengubah aplikasi. Namun, seperti ditunjukkan dalam diagram sebelumnya, aplikasi harus memiliki akses ke internet untuk menggunakan metode ini. Aplikasi juga bertanggung jawab untuk mengelola sesi setelah pengguna diautentikasi.
Identity-Aware Proxy
Pendekatan ketiga, yang dibahas dalam tutorial ini, adalah menggunakan IAP untuk menangani semua autentikasi dan pengelolaan sesi dengan setiap perubahan pada aplikasi. IAP mencegat semua permintaan web ke aplikasi Anda, memblokir permintaan apa pun yang belum diautentikasi, dan meneruskan permintaan lainnya dengan data identitas pengguna yang ditambahkan ke setiap permintaan.
Penanganan permintaan ditampilkan dalam diagram berikut.
Permintaan dari pengguna dicegat oleh IAP, yang memblokir permintaan yang tidak diautentikasi. Permintaan yang diautentikasi diteruskan ke aplikasi, selama pengguna yang diautentikasi tercantum dalam daftar pengguna yang diizinkan. Permintaan yang diteruskan melalui IAP memiliki header yang ditambahkan ke dalamnya yang mengidentifikasi pengguna yang membuat permintaan.
Aplikasi tidak perlu lagi menangani informasi sesi atau akun pengguna. Setiap operasi yang perlu mengetahui ID unik bagi pengguna bisa mendapatkannya secara langsung dari setiap permintaan web yang masuk. Namun, metode ini hanya dapat digunakan untuk layanan komputasi yang mendukung IAP, seperti App Engine dan load balancer. Anda tidak dapat menggunakan IAP pada mesin pengembangan lokal.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.