Mengelola sesi IAP

Halaman ini menjelaskan cara Identity-Aware Proxy (IAP) menangani permintaan dengan sesi yang telah berakhir dan cara memastikan bahwa permintaan aplikasi AJAX dan permintaan WebSocket berhasil.

Alur sesi IAP

Saat menggunakan alur login IAP standar, pengguna menerima cookie sesi yang mereferensikan sesi login Google mereka. IAP menggunakan cookie ini untuk mengonfirmasi bahwa pengguna masih login. IAP mengharuskan pengguna login sebelum mengakses aplikasi yang diamankan IAP.

Sesi IAP diperbarui secara berkala. Namun, jika pengguna menggunakan Akun Google untuk login, sesi IAP juga terkait dengan sesi login Google pengguna. Dalam hal ini, IAP hanya akan mewajibkan pengguna login lagi dalam salah satu situasi berikut:

  • Pengguna logout dari akunnya
  • Akunnya ditangguhkan
  • Akun memerlukan reset sandi

Jika pengguna logout, IAP akan mendeteksi perubahan status Akun Google dalam beberapa menit. Setelah terdeteksi, IAP membatalkan sesi.

IAP memeriksa ulang otorisasi Identity and Access Management (IAM) untuk semua permintaan selama sesi yang valid. Pembaruan pada kebijakan akses IAM aplikasi yang diamankan IAP mungkin memerlukan waktu beberapa menit untuk diterapkan.

Masa berlaku sesi IAP

Untuk alur login menggunakan akun Google, sesi IAP terikat dengan sesi login Google yang mendasarinya, dan hanya berakhir saat sesi tersebut berakhir, terlepas dari klaim exp dalam JWT yang dikirim di header otorisasi.

Untuk autentikasi terprogram, IAP memang mematuhi klaim exp di JWT yang dikirim di header Otorisasi.

Untuk alur login Identity Platform, sesi IAP tetap valid hingga satu jam setelah pengguna logout.

Perintah login untuk Akun Google

Nilai loginHint yang ditetapkan melalui IapSettings harus cocok dengan domain pengguna yang login. Jika nilai ini tidak cocok, perintah login akan ditampilkan jika cookie IAP dihapus atau habis masa berlakunya.

Permintaan WebSocket

IAP hanya mendukung WebSocket untuk permintaan awal dan tidak terus-menerus memeriksa otorisasi. Saat permintaan WebSocket diterima, permintaan tersebut dimulai dengan permintaan HTTP Upgrade. IAP mengevaluasi ini sebagai permintaan HTTP GET standar. Setelah permintaan diizinkan, IAP meneruskan permintaan ke server, sehingga membuka koneksi persisten. Setelah itu, IAP tidak memantau permintaan atau memperbarui sesi.

Respons sesi yang berakhir

IAP menampilkan respons yang berbeda untuk sesi yang telah berakhir berdasarkan jenis permintaan.

Permintaan non-AJAX

Untuk permintaan non-AJAX, pengguna akan dialihkan ke alur login untuk memperbarui sesi. Jika pengguna masih login, pengalihan ini transparan.

Permintaan AJAX

Chrome dan browser lain menghentikan penggunaan cookie pihak ketiga. Rekomendasi untuk membuat permintaan AJAX di halaman ini tidak akan berfungsi jika cookie pihak ketiga dinonaktifkan. Namun, rekomendasi yang diberikan akan tetap berfungsi jika sumber dan target permintaan AJAX berasal dari situs yang sama.

Untuk mengetahui petunjuk tentang cara mengelola cookie pihak ketiga di Chrome, lihat Menghapus, mengizinkan, dan mengelola cookie di Chrome.

IAP mengandalkan cookie untuk mengelola sesi pengguna. Hal ini juga mengandalkan urutan pengalihan untuk membuat sesi sebagai bagian dari alur login. Sesi tidak selalu dapat dibuat jika aplikasi menggunakan Cross-Origin Resource Sharing (CORS) untuk membuat permintaan AJAX ke aplikasi yang dilindungi IAP.

Agar berhasil membuat permintaan CORS ke aplikasi yang dilindungi IAP, sesi IAP harus dibuat di luar band. Perhatikan bahwa untuk permintaan AJAX yang mengirim permintaan CORS dari source_domain->target_domain tempat target_domain menghosting aplikasi yang dilindungi IAP, sesi harus dibuat di target_domain. Tidak ada cara untuk membagikan cookie antara source_domain dan target_domain.

Setelah sesi di target_domain dibuat, developer harus mengaktifkan kredensial untuk dikirim dalam permintaan. Secara default, metode JavaScript tidak melampirkan cookie ke permintaan. Untuk mengaktifkan kredensial dalam permintaan, permintaan yang dikirim dengan objek XMLHttpRequest harus menetapkan properti withCredentials ke benar, sedangkan permintaan yang dikirim dengan Fetch API harus menetapkan opsi credentials ke include atau same-origin.

Panduan berikut merekomendasikan pola bagi developer web agar dapat memulai dan memperbarui sesi IAP dengan berhasil.

Memahami respons IAP

Untuk permintaan AJAX, IAP menampilkan kode status HTTP 401: Unauthorized. Perhatikan bahwa deteksi permintaan AJAX tidak dapat dilakukan dengan sempurna. Jika Anda mendapatkan respons kode status 302, bukan kode status 401 untuk permintaan AJAX, header X-Requested-With dengan nilai "XMLHttpRequest" dapat ditambahkan ke permintaan AJAX. Tindakan ini memberi tahu IAP bahwa permintaan berasal dari JavaScript.

Menangani respons AJAX 401 HTTP

Untuk membuat sesi IAP setelah aplikasi menerima HTTP 401, aplikasi dapat membuka jendela baru untuk URL target_domain + ?gcp-iap-mode=DO_SESSION_REFRESH. Ini adalah handler khusus yang hanya membuat sesi IAP di target_domain. Jika jendela tetap terbuka, sesi akan terus di-refresh secara berkala, dan meminta input pengguna sesuai kebutuhan. Secara opsional, pengguna dapat memilih untuk menutup jendela, dan handler untuk status HTTP 401 dalam kode developer akan memunculkan kembali jendela untuk refresh sesi sesuai kebutuhan.

Langkah 1: Ubah kode aplikasi Anda

Contoh berikut menunjukkan cara mengubah kode aplikasi Anda untuk menangani kode status HTTP 401 dan memberikan link refresh sesi kepada pengguna:

if (response.status === 401) {
  statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
}
Langkah 2: Instal pengendali onclick

Contoh kode di bawah menginstal handler onclick yang menutup jendela setelah sesi dimuat ulang:

var iapSessionRefreshWindow = null;

function sessionRefreshClicked() {
  if (iapSessionRefreshWindow == null) {
    iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
    window.setTimeout(checkSessionRefresh, 500);
  }
  return false;
}

function checkSessionRefresh() {
  if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
    // Attempting to start a new session.
    // XMLHttpRequests is used by the server to identify AJAX requests
    fetch('/favicon.ico', {
          method: "GET",
          credentials: 'include',
          headers: {
              'X-Requested-With': 'XMLHttpRequest'
          }
    .then((response) => {
      // Checking if browser has a session for the requested app
      if (response.status === 401) {
        // No new session detected. Try to get a session again
        window.setTimeout(checkSessionRefresh, 500);
      } else {
        // Session retrieved.
        iapSessionRefreshWindow.close();
        iapSessionRefreshWindow = null;
      }
    })
    });
  } else {
    iapSessionRefreshWindow = null;
  }
}