Autentikasi pengguna dengan Identity-Aware Proxy

Mengautentikasi pengguna aplikasi web sering kali diperlukan, dan biasanya memerlukan pemrograman khusus di aplikasi Anda. Untuk aplikasi Google Cloud Platform, Anda dapat melepaskan tanggung jawab tersebut ke layanan Identity-Aware Proxy. Jika Anda hanya perlu membatasi akses ke pengguna yang dipilih, tidak ada perubahan yang diperlukan pada aplikasi. Jika aplikasi perlu mengetahui identitas pengguna (seperti untuk menjaga preferensi pengguna di sisi server), Identity-Aware Proxy dapat memberikannya dengan kode aplikasi minimal.

Apa itu Identity-Aware Proxy?

Identity-Aware Proxy (IAP) adalah layanan Google Cloud Platform yang mencegat permintaan web yang dikirim ke aplikasi Anda, mengautentikasi pengguna yang membuat permintaan menggunakan Layanan Identitas Google, dan hanya mengizinkan permintaan jika permintaan tersebut berasal dari pengguna yang Anda izinkan. Selain itu, aplikasi dapat mengubah header permintaan untuk menyertakan informasi tentang pengguna terautentikasi.

Codelab ini akan memandu Anda dalam membuat aplikasi sendiri, membatasi akses ke aplikasi, dan mendapatkan identitas pengguna dari IAP.

Yang akan Anda buat

Dalam codelab ini, Anda akan membuat aplikasi web minimal dengan Google App Engine, lalu pelajari berbagai cara menggunakan Identity-Aware Proxy untuk membatasi akses ke aplikasi dan memberikan informasi identitas pengguna ke aplikasi tersebut. Aplikasi Anda akan:

  • Menampilkan halaman sambutan
  • Mengakses informasi identitas pengguna yang diberikan oleh IAP
  • Menggunakan verifikasi kriptografi untuk mencegah spoofing informasi identitas pengguna

Yang akan Anda pelajari

  • Cara menulis dan men-deploy aplikasi App Engine sederhana menggunakan Python 3.7
  • Cara mengaktifkan dan menonaktifkan IAP untuk membatasi akses ke aplikasi
  • Cara memasukkan informasi identitas pengguna dari IAP ke aplikasi Anda
  • Cara memverifikasi informasi dari IAP secara kriptografis untuk melindungi dari spoofing

Yang Anda butuhkan

  • Browser web modern seperti Chrome.
  • Pengetahuan dasar tentang bahasa pemrograman Python

Codelab ini berfokus pada Google App Engine dan IAP. Konsep dan blok kode yang tidak-relevan akan dipoles dan disediakan sehingga Anda cukup salin dan tempel.

Anda akan bekerja di lingkungan command line Cloud Shell. Mulai dengan membuka lingkungan tersebut dan mengambil kode contoh ke dalamnya.

Meluncurkan Konsol dan Cloud Shell

Di bagian kiri atas halaman lab, klik tombol Buka Konsol Google. Anda harus login dengan Nama Pengguna dan Sandi yang ditampilkan di bawah tombol tersebut.

Semua perintah dalam codelab ini akan dijalankan dalam Cloud Shell untuk project yang dibuat dan dibuka untuk Anda. Buka Cloud Shell dengan mengklik ikon Aktifkan Cloud Shell yang ada di sisi kanan header halaman konsol. Paruh bawah halaman akan memungkinkan Anda untuk memasukkan dan menjalankan perintah.

Perintah dapat dijalankan dari PC Anda sendiri, tetapi Anda harus menginstal dan mengonfigurasi software pengembangan yang diperlukan terlebih dahulu. Cloud Shell sudah memiliki semua alat software yang Anda butuhkan.

Mendownload kode

Klik area command line di Cloud Shell sehingga Anda dapat mengetik perintah. Ambil kode dari GitHub kemudian ubah ke folder kode:

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab

Folder ini berisi satu subfolder untuk setiap langkah codelab ini. Anda akan beralih ke folder yang benar untuk melakukan setiap langkah.

Ini adalah aplikasi App Engine Standard yang ditulis di Python 3.7 yang hanya menampilkan halaman sambutan "Hello, World". Kita akan men-deploy dan mengujinya, lalu membatasi akses ke dalamnya menggunakan IAP.

Meninjau kode aplikasi

Ubah dari folder project utama ke subfolder 1-HelloWorld yang berisi kode untuk langkah ini.

cd 1-HelloWorld

Kode aplikasi ada di file main.py. Framework web ini menggunakan framework web Flask untuk merespons permintaan web dengan konten template. File template tersebut ada di templates/index.html, dan untuk langkah ini hanya berisi HTML biasa. File template kedua berisi contoh kebijakan privasi kerangka di templates/privacy.html.

Ada dua file lainnya: requirements.txt mencantumkan semua library Python non-default yang digunakan aplikasi, dan app.yaml memberi tahu Google Cloud Platform bahwa ini adalah aplikasi Python 3.7 App Engine.

Anda dapat mencantumkan setiap file dalam shell menggunakan perintah cat, seperti dalam:

cat main.py

Atau, Anda dapat membuka editor kode Cloud Shell dengan mengklik ikon Pensil di sisi kanan atas jendela Cloud Shell, lalu memeriksa kode tersebut.

Anda tidak perlu mengubah file apa pun untuk langkah ini.

Men-deploy ke App Engine

Sekarang deploy aplikasi ke lingkungan Standar App Engine untuk Python 3.7

gcloud app deploy

Anda mungkin diminta untuk memilih region tujuan deployment. Pilih salah satu yang ada di dekat Anda yang bertuliskan "mendukung standar". Saat ditanya apakah ingin melanjutkan, masukkan Y untuk ya.

Dalam beberapa menit, deployment akan selesai, dan Anda akan melihat pesan bahwa Anda dapat melihat aplikasi Anda dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka di browser Anda, klik link yang ditampilkan untuk membukanya di tab baru, atau salin ke tab baru yang dibuka secara manual jika perlu. Karena ini adalah pertama kalinya aplikasi ini dijalankan, perlu waktu beberapa detik untuk muncul saat instance cloud dimulai, dan Anda akan melihat jendela berikut.

Anda dapat membuka URL yang sama dari komputer mana pun yang terhubung ke internet untuk melihat halaman web tersebut. Akses belum dibatasi.

Membatasi akses dengan IAP

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik 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 TOMBOL LAYAR KONFIGURASIKAN. Tab baru akan terbuka untuk mengonfigurasi layar izin.

Lengkapi bagian yang diperlukan dengan nilai yang sesuai:

Nama aplikasi

Contoh IAP

Email dukungan

alamat email Anda. Alamat ini mungkin sudah diisi untuk Anda.

Domain yang diotorisasi

bagian nama host URL aplikasi, mis. iap-example-999999.appspot.com. Anda dapat melihatnya di kolom URL halaman web Hello World yang sebelumnya Anda buka. Jangan sertakan https:// awal atau akhir / dari URL tersebut.

Anda harus menekan Enter setelah mengisi nilai ini.

Link halaman beranda aplikasi

URL yang digunakan untuk melihat aplikasi

Link Kebijakan privasi aplikasi

link halaman privasi di aplikasi, sama seperti link halaman beranda dengan /privacy yang ditambahkan ke bagian akhir

Klik Simpan. Anda akan diminta untuk membuat kredensial. Anda tidak perlu membuat kredensial untuk codelab ini, sehingga Anda dapat menutup tab browser ini.

Kembali ke halaman Identity-Aware Proxy dan muat ulang. Sekarang Anda akan melihat daftar resource yang dapat dilindungi.

Klik tombol beralih di kolom IAP pada baris aplikasi App Engine untuk mengaktifkan IAP.

Anda akan melihat nama domain yang akan dilindungi oleh IAP. Klik AKTIFKAN.

Sekarang buka tab browser dan pilih URL untuk aplikasi Anda. Anda akan melihat layar Login dengan Google yang mengharuskan Anda login untuk mengakses aplikasi.

Login dengan akun Google atau G Suite. Anda akan melihat layar yang menolak akses Anda.

Anda telah berhasil melindungi aplikasi dengan IAP, tetapi Anda belum memberi tahu IAP akun mana yang diizinkan.

Kembali ke halaman Identity-Aware Proxy pada konsol, pilih kotak centang di samping aplikasi App Engine, dan lihat sidebar di sebelah kanan halaman.

Setiap alamat email (atau alamat Google Grup, atau nama domain G Suite) yang harus diizinkan perlu ditambahkan sebagai Anggota. Klik TAMBAHKAN ANGGOTA. Masukkan alamat email Anda, lalu pilih peran Cloud IAP/IAP-Secured Web App User untuk ditetapkan ke alamat tersebut. Anda dapat memasukkan lebih banyak alamat atau domain G Suite dengan cara yang sama.

Klik Simpan. Pesan "Kebijakan Diperbarui" akan muncul di bagian bawah jendela.

Kembali ke aplikasi Anda, lalu muat ulang halaman. Anda sekarang akan melihat aplikasi web, karena Anda telah login dengan pengguna yang diotorisasi. Namun, Anda mungkin masih melihat halaman "Anda tidak memiliki akses" karena IAP mungkin tidak memeriksa ulang otorisasi Anda. Dalam hal ini, lakukan langkah-langkah berikut:

  • Buka browser web ke alamat halaman beranda dengan tambahan /_gcp_iap/clear_login_cookie di bagian akhir URL, seperti pada https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Anda akan melihat layar Login dengan Google baru, dengan akun Anda sudah ditampilkan. Jangan klik akun. Sebagai gantinya, klik Gunakan akun lain, lalu masukkan kembali kredensial Anda.
  • Langkah-langkah ini menyebabkan IAP memeriksa ulang akses Anda dan Anda akan melihat layar utama aplikasi.

Jika memiliki akses ke browser lain atau dapat menggunakan Mode Samaran di browser, dan memiliki akun GMail atau G Suite lain yang valid, Anda dapat menggunakan browser tersebut untuk membuka halaman aplikasi dan login dengan akun lain. Karena belum diberi otorisasi, akun ini akan menampilkan layar "Anda Tidak Memiliki Akses", bukan aplikasi Anda.

Setelah dilindungi dengan IAP, aplikasi dapat menggunakan informasi identitas yang diberikan IAP di header permintaan web yang diteruskannya. Pada langkah ini, aplikasi akan mendapatkan alamat email pengguna yang login dan ID pengguna unik tetap yang diberikan oleh Layanan Identitas Google kepada pengguna tersebut. Data tersebut akan ditampilkan kepada pengguna di halaman selamat datang.

Ini adalah langkah 2, dan langkah terakhir diakhiri dengan Cloud Shell yang terbuka di folder iap-codelab/1-HelloWorld. Ubah ke folder untuk langkah ini:

cd ~/iap-codelab/2-HelloUser

Deploy ke App Engine

Karena deployment memerlukan waktu beberapa menit, mulai dengan men-deploy aplikasi ke lingkungan App Engine Standard untuk Python 3.7:

gcloud app deploy

Saat ditanya apakah ingin melanjutkan, tekan Y untuk ya. Dalam beberapa menit, deployment akan selesai. Sembari menunggu, Anda dapat memeriksa file aplikasi seperti yang dijelaskan di bawah.

Saat deployment siap, Anda akan melihat pesan bahwa Anda dapat melihat aplikasi dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka di browser Anda, salin link yang ditampilkan, lalu buka di tab baru seperti biasa. Anda akan melihat halaman yang serupa dengan berikut ini:

Anda mungkin harus menunggu beberapa menit hingga versi baru aplikasi menggantikan versi sebelumnya. Muat ulang halaman jika perlu untuk melihat halaman yang mirip dengan yang di atas.

Memeriksa file aplikasi

Folder ini berisi kumpulan file yang sama seperti yang terlihat di Langkah 1, namun dua file telah diubah: main.py dan templates/index.html. Program telah diubah untuk mengambil informasi pengguna yang disediakan IAP dalam header permintaan, dan template sekarang menampilkan data tersebut.

Ada dua baris di main.py yang mendapatkan data identitas yang disediakan IAP:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')

Header X-Goog-Authenticated-User- disediakan oleh IAP, dan namanya tidak peka huruf besar/kecil, sehingga dapat diberikan dalam huruf besar atau kecil jika diinginkan. Pernyataan render_template sekarang menyertakan nilai tersebut sehingga dapat ditampilkan:

page = render_template('index.html', email=user_email, id=user_id)

Template index.html dapat menampilkan nilai tersebut dengan menyertakan nama dalam tanda kurung kurawal ganda:

Hello, {{ email }}! Your persistent ID is {{ id }}.

Seperti yang dapat Anda lihat, data yang disediakan diawali dengan accounts.google.com:, yang menunjukkan asal informasi. Aplikasi Anda dapat menghapus semuanya hingga dan menyertakan titik dua untuk mendapatkan nilai mentah jika diinginkan.

Menonaktifkan IAP

Apa yang terjadi pada aplikasi ini jika IAP dinonaktifkan atau diabaikan (seperti oleh aplikasi lain yang berjalan di project cloud yang sama)? Nonaktifkan IAP untuk melihatnya.

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik Identity-Aware Proxy. Klik tombol IAP di samping aplikasi App Engine untuk menonaktifkan IAP.

Anda akan diperingatkan bahwa tindakan ini akan mengizinkan semua pengguna mengakses aplikasi.

Muat ulang halaman web aplikasi. Anda akan melihat halaman yang sama, tetapi tanpa informasi pengguna:

Karena aplikasi sekarang tidak dilindungi, pengguna dapat mengirim permintaan web yang tampaknya telah melewati IAP. Misalnya, Anda dapat menjalankan perintah curl berikut dari Cloud Shell untuk melakukannya (ganti <url-Anda-di sini> dengan URL yang benar untuk aplikasi Anda):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

Halaman web akan ditampilkan di command line, dan terlihat seperti berikut:

<!doctype html>
<html>
<head>
  <title>IAP Hello User</title>
</head>
<body>
  <h1>Hello World</h1>

  <p>
    Hello, totally fake email! Your persistent ID is None.
  </p>

  <p>
    This is step 2 of the <em>User Authentication with IAP</em>
    codelab.
 </p>

</body>
</html>

Aplikasi tidak dapat mengetahui bahwa IAP telah dinonaktifkan atau diabaikan. Untuk kasus yang kemungkinan berisiko, langkah 3 menunjukkan solusinya.

Jika ada risiko IAP dinonaktifkan atau diabaikan, aplikasi Anda dapat memeriksa untuk memastikan informasi identitas yang diterimanya valid. Opsi ini menggunakan header permintaan web ketiga yang ditambahkan oleh IAP, yang disebut X-Goog-IAP-JWT-Assertion. Nilai header adalah objek yang ditandatangani secara kriptografis yang juga berisi data identitas pengguna. Aplikasi Anda dapat memverifikasi tanda tangan digital dan menggunakan data yang disediakan dalam objek ini untuk memastikan bahwa tanda tangan tersebut diberikan oleh IAP tanpa perubahan.

Verifikasi tanda tangan digital memerlukan beberapa langkah tambahan, seperti mengambil rangkaian kunci publik Google terbaru. Anda dapat memutuskan apakah aplikasi Anda memerlukan langkah-langkah tambahan ini berdasarkan risiko bahwa seseorang mungkin dapat menonaktifkan atau mengabaikan IAP, dan sensitivitas aplikasi.

Ini adalah langkah 3, dan langkah terakhir diakhiri dengan Cloud Shell yang terbuka di folder iap-codelab/2-HelloUser. Ubah ke folder untuk langkah ini:

cd ~/iap-codelab/3-HelloVerifiedUser

Men-deploy ke App Engine

Deploy aplikasi ke lingkungan Standar App Engine untuk Python 3.7:

gcloud app deploy

Saat ditanya apakah ingin melanjutkan, tekan Y untuk ya. Dalam beberapa menit, deployment akan selesai. Sembari menunggu, Anda dapat memeriksa file aplikasi seperti yang dijelaskan di bawah.

Saat deployment siap, Anda akan melihat pesan bahwa Anda dapat melihat aplikasi dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka di browser Anda, salin link yang ditampilkan, lalu buka di tab baru seperti biasa.

Ingatlah bahwa Anda menonaktifkan IAP pada Langkah 2, sehingga tidak ada data IAP yang disediakan untuk aplikasi. Anda akan melihat halaman yang serupa dengan berikut ini:

Seperti sebelumnya, Anda mungkin perlu menunggu beberapa menit agar versi terbaru ditayangkan untuk melihat halaman versi baru.

Karena IAP dinonaktifkan, informasi pengguna tidak tersedia. Sekarang aktifkan kembali IAP.

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik Identity-Aware Proxy. Klik tombol pengalih IAP di samping aplikasi App Engine untuk mengaktifkan lagi IAP.

Muat ulang halaman. Halaman akan terlihat seperti berikut:

Perhatikan bahwa alamat email yang diberikan oleh metode terverifikasi tidak memiliki awalan accounts.google.com:.

Jika IAP dinonaktifkan atau diabaikan, data terverifikasi akan hilang atau tidak valid, karena tidak dapat memiliki tanda tangan yang valid kecuali dibuat oleh pemegang kunci pribadi Google.

Memeriksa file aplikasi

Folder ini berisi kumpulan file yang sama seperti yang dilihat pada Langkah 2, dengan dua file diubah dan satu file baru. File baru adalah auth.py, yang menyediakan metode user() untuk mengambil dan memverifikasi informasi identitas yang ditandatangani secara kriptografis. File yang diubah adalah main.py dan templates/index.html, yang sekarang menggunakan hasil metode tersebut. Header yang belum diverifikasi seperti yang ditemukan di langkah 2 juga ditampilkan sebagai perbandingan.

Fungsi baru utamanya berada dalam fungsi user():

def user():
    assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
    if assertion is None:
        return None, None

    info = jwt.decode(
        assertion,
        keys(),
        algorithms=['ES256'],
        audience=audience()
    )

    return info['email'], info['sub']

assertion adalah data yang ditandatangani secara kriptografis yang diberikan di header permintaan yang ditentukan. Kode ini menggunakan library untuk memvalidasi dan mendekode data tersebut. Validasi menggunakan kunci publik yang disediakan oleh Google untuk memeriksa data yang ditandatangani, dan mengetahui audience yang menyediakan data tersebut (pada dasarnya, project Google Cloud yang dilindungi). Fungsi bantuan keys() dan audience() mengumpulkan dan menampilkan nilai tersebut.

Objek yang ditandatangani memiliki dua data yang diperlukan: alamat email terverifikasi, dan nilai ID unik (diberikan di sub, untuk kolom standar pelanggan).

Ini menyelesaikan Langkah 3.

Anda telah men-deploy aplikasi web App Engine. Pada Langkah 1, Anda membatasi akses ke aplikasi hanya untuk pengguna yang dipilih. Pada Langkah 2, Anda mengambil dan menampilkan identitas pengguna bahwa IAP mengizinkan akses ke aplikasi Anda, dan melihat bagaimana informasi tersebut dapat di-spoofing jika IAP dinonaktifkan atau diabaikan. Pada Langkah 3, Anda memverifikasi pernyataan yang ditandatangani secara kriptografis atas identitas pengguna yang tidak dapat di-spoofing.

Satu-satunya resource Google Cloud Platform yang Anda gunakan dalam codelab ini adalah instance App Engine. Setiap kali Anda men-deploy aplikasi, versi baru telah dibuat dan terus ada hingga dihapus. Keluar dari lab untuk menghapus project dan semua resource di dalamnya.