Menambahkan Header Permintaan HTTP tambahan

Permintaan HTTP berisi header seperti User-Agent atau Content-Type. Selain header yang dilampirkan oleh browser, aplikasi Android dapat menambahkan header tambahan, seperti Cookie atau Perujuk melalui Intent tambahan EXTRA_HEADERS. Karena alasan keamanan, Chrome memfilter beberapa header tambahan bergantung pada cara dan tempat intent diluncurkan.

Permintaan lintas origin memerlukan lapisan keamanan tambahan karena klien dan server tidak dimiliki oleh pihak yang sama. Panduan ini membahas peluncuran permintaan tersebut melalui tab khusus Chrome, yaitu intent yang diluncurkan dari aplikasi yang membuka URL di tab browser. Hingga Chrome 83, developer dapat menambahkan header apa pun saat meluncurkan Tab Khusus. Mulai versi 83 dan seterusnya, Chrome mulai memfilter semua header lintas origin kecuali yang disetujui, karena header yang tidak disetujui menyebabkan risiko keamanan. Mulai Chrome 86, Anda dapat melampirkan header yang tidak disetujui ke permintaan lintas-asal, jika server dan klien terkait menggunakan link aset digital. Perilaku ini dirangkum dalam tabel berikut:

Versi Chrome Header CORS diizinkan
sebelum Chrome 83 disetujui, tidak disetujui
Chrome 83 hingga Chrome 85 disetujui
dari Chrome 86 dan yang lebih baru disetujui, tidak disetujui saat Digital Asset Links disiapkan

Tabel 1.: Pemfilteran header CORS yang tidak disetujui.

Artikel ini menunjukkan cara menyiapkan koneksi terverifikasi antara server dan klien serta menggunakannya untuk mengirim header http yang disetujui dan tidak disetujui. Anda dapat langsung ke Menambahkan Header Tambahan ke Intent Tab Kustom untuk kode.

Latar belakang

Header Permintaan CORS yang Disetujui vs. Tidak Disetujui

Cross-Origin Resource Sharing (CORS) memungkinkan aplikasi web dari satu origin meminta resource dari origin yang berbeda. Daftar header yang disetujui CORS dikelola di Standar HTML. Contoh header yang disetujui ditampilkan dalam tabel berikutnya:

Header Deskripsi
accept-language mengiklankan bahasa alami yang dipahami klien
content-language menjelaskan bahasa yang ditujukan untuk audiens saat ini
content-type menunjukkan jenis media resource

Tabel 2.: Contoh header CORS yang disetujui.

Header yang disetujui dianggap aman karena tidak berisi informasi pengguna sensitif dan tidak mungkin menyebabkan server melakukan operasi yang berpotensi merusak.

Contoh header yang tidak disetujui ditampilkan dalam tabel berikut:

Header Deskripsi
bearer-token mengautentikasi klien di server
asal menunjukkan asal permintaan
kue berisi cookie yang ditetapkan oleh server

Tabel 3.: Contoh header CORS yang tidak disetujui.

Menyertakan header yang tidak disetujui ke permintaan CORS tidak dianjurkan oleh standar HTML dan server menganggap bahwa permintaan lintas-asal hanya berisi header yang disetujui. Mengirim header yang tidak disetujui dari domain lintas origin akan memungkinkan aplikasi pihak ketiga berbahaya membuat header yang menyalahgunakan cookie pengguna yang disimpan dan dilampirkan ke permintaan oleh Chrome (atau browser lain). Cookie dapat melakukan autentikasi transaksi server berbahaya yang tidak akan mungkin dilakukan.

Melampirkan header CORS yang disetujui ke permintaan Tab Kustom

Tab Kustom adalah cara khusus untuk meluncurkan halaman web di tab browser yang disesuaikan. Intent Tab kustom dapat dibuat menggunakan CustomTabsIntent.Builder(). Anda juga dapat melampirkan header ke intent ini menggunakan Bundle dengan flag Browser.EXTRA_HEADERS:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

Kita selalu dapat melampirkan header yang disetujui ke permintaan CORS tab kustom. Namun, Chrome memfilter header yang tidak disetujui secara default. Meskipun browser lain mungkin memiliki perilaku yang berbeda, developer harus bersiap untuk memblokir header yang tidak disetujui secara umum.

Cara yang didukung untuk menyertakan header yang tidak disetujui dalam tab kustom adalah dengan memverifikasi koneksi lintas-asal terlebih dahulu menggunakan link akses digital. Bagian berikutnya menunjukkan cara menyiapkan intent Tab Kustom ini dan meluncurkan intent Tab Kustom dengan header yang diperlukan.

Menambahkan Header Tambahan ke Intent Tab Kustom

Agar header yang tidak disetujui dapat diteruskan melalui intent Tab Kustom, Anda harus menyiapkan link aset digital antara aplikasi Android dan web yang memverifikasi bahwa penulis memiliki kedua aplikasi tersebut.

Ikuti panduan resmi untuk menyiapkan penautan aset digital. Untuk hubungan link, gunakan "delegate_permission/common.use_as_origin"` yang menunjukkan bahwa kedua aplikasi berasal dari origin yang sama setelah penautan diverifikasi.

Membuat Intent Tab Kustom dengan Header Tambahan

Ada beberapa cara untuk membuat intent Tab Kustom. Anda dapat menggunakan builder yang tersedia di androidX dengan menambahkan library ke dependensi build:

MULTI_LINE_CODE_PLACEHOLDER_1

Buat intent dan tambahkan header tambahan:

MULTI_LINE_CODE_PLACEHOLDER_2

Koneksi Tab Khusus digunakan untuk menyiapkan CustomTabsSession antara aplikasi dan tab Chrome. Kita memerlukan sesi untuk memverifikasi bahwa aplikasi dan aplikasi web berasal dari origin yang sama. Verifikasi hanya akan lulus jika digital asset link disiapkan dengan benar.

Sebaiknya panggil CustomTabsClient.warmup(). Hal ini memungkinkan aplikasi browser melakukan pra-inisialisasi di latar belakang dan mempercepat proses pembukaan URL.

MULTI_LINE_CODE_PLACEHOLDER_3

Menyiapkan Callback yang Meluncurkan Intent setelah Validasi

CustomTabsCallback diteruskan ke sesi. Kita menyiapkan onRelationshipValidationResult() untuk meluncurkan CustomTabsIntent yang dibuat sebelumnya setelah verifikasi origin berhasil.

MULTI_LINE_CODE_PLACEHOLDER_4

Mengikat koneksi layanan tab kustom

Mengikat layanan akan meluncurkan layanan dan onCustomTabsServiceConnected() koneksi akan dipanggil pada akhirnya. Jangan lupa untuk membatalkan pengikatan layanan dengan benar. Pengikatan dan pelepasan ikatan biasanya dilakukan dalam metode siklus proses aktivitas onStart() dan onStop().

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

Kode aplikasi demo

Anda dapat menemukan detail selengkapnya tentang Layanan Tab Kustom di sini. Lihat repositori GitHub android-browser-helper untuk mengetahui aplikasi contoh yang berfungsi.

Ringkasan

Panduan ini menunjukkan cara menambahkan header arbitrer ke permintaan CORS tab kustom. header yang disetujui dapat dilampirkan ke setiap permintaan CORS tab kustom. Header yang tidak disetujui secara umum dianggap tidak aman dalam permintaan CORS dan Chrome memfilternya secara default. Lampiran tersebut hanya diizinkan untuk klien dan server dengan asal yang sama, yang diverifikasi oleh link aset digital.