Menambahkan Header Permintaan HTTP tambahan

Permintaan HTTP berisi header seperti User-Agent atau Content-Type. Selain {i>header<i} yang dilampirkan oleh browser, aplikasi Android dapat menambahkan {i>header<i} ekstra, seperti Cookie atau Perujuk melalui EXTRA_HEADERS Intent tambahan. Untuk alasan keamanan, Chrome memfilter beberapa header tambahan bergantung pada bagaimana dan di mana intent diluncurkan.

Permintaan lintas asal memerlukan lapisan keamanan tambahan karena klien dan server tidak dimiliki oleh pihak yang sama. Panduan ini membahas peluncuran permintaan tersebut melalui Chrome tab kustom, 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 kecuali header lintas origin yang disetujui, karena header yang tidak disetujui menimbulkan risiko keamanan. Mulai Chrome 86, Anda dapat melampirkan header yang tidak disetujui ke permintaan lintas origin, jika server dan klien terkait menggunakan digital asset link. Perilaku ini diringkas dalam tabel berikut:

Versi Chrome Header CORS diizinkan
sebelum Chrome 83 disetujui, tidak disetujui
Chrome 83 hingga Chrome 85 disetujui
mulai Chrome 86 dan seterusnya disetujui, tidak disetujui saat link aset digital 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 serta yang tidak disetujui. Anda dapat langsung ke Menambahkan Header Tambahan ke Intent Tab Khusus untuk kode.

Latar belakang

Header Permintaan CORS yang disetujui vs. Tidak disetujui

Cross-Origin Resource Sharing (CORS) memungkinkan aplikasi web dari satu asal untuk melakukan permintaan resource dari origin yang berbeda. Daftar header yang disetujui CORS disimpan di Standar HTML. Contoh header yang disetujui ditampilkan di tabel berikutnya:

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

Tabel 2.: Contoh header CORS yang disetujui.

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

Contoh header yang tidak disetujui ditampilkan dalam tabel berikut:

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

Tabel 3.: Contoh header CORS yang tidak disetujui.

Standar HTML dan server tidak menyertakan header yang tidak disetujui ke permintaan CORS mengasumsikan bahwa permintaan lintas asal hanya berisi header yang disetujui. Mengirim header yang tidak disetujui dari domain lintas origin akan memungkinkan aplikasi pihak ketiga yang berbahaya membuat header yang menyalahgunakan cookie yang disimpan dan dilampirkan oleh Chrome (atau browser lain) ke permintaan. Cookie tersebut dapat mengotentikasi transaksi server berbahaya yang tidak mungkin dilakukan.

Melampirkan header CORS yang disetujui ke permintaan Tab Khusus

Tab Khusus adalah cara khusus untuk meluncurkan halaman web di tab browser khusus. Tab Khusus intent dapat dibuat menggunakan CustomTabsIntent.Builder(). Anda juga dapat melampirkan {i>header <i}ke intent 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"));

Kami dapat melampirkan header yang disetujui ke permintaan CORS tab khusus kapan saja. Namun, filter Chrome header yang tidak disetujui secara default. Meskipun {i>browser<i} lain mungkin memiliki perilaku yang berbeda, developer akan memblokir header yang tidak disetujui secara umum.

Cara yang didukung untuk menyertakan header yang tidak disetujui di tab khusus adalah dengan memverifikasi terlebih dahulu koneksi lintas origin menggunakan link akses digital. Bagian berikutnya menunjukkan cara menyetel dan luncurkan intent Tab Khusus dengan header yang diperlukan.

Menambahkan Header Tambahan ke Intent Tab Khusus

Untuk mengizinkan header yang tidak disetujui diteruskan melalui intent Tab Khusus, Anda perlu menetapkan tautan aset digital antara aplikasi Android dan web yang memverifikasi bahwa pembuat memiliki kedua aplikasi tersebut.

Ikuti panduan resmi untuk menyiapkan link aset digital. Untuk penggunaan relasi tautan "delegate_permission/common.use_as_origin"` yang menunjukkan bahwa kedua aplikasi dimiliki oleh domain yang sama setelah tautan diverifikasi.

Membuat Intent Tab Khusus dengan Header Tambahan

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

MULTI_LINE_CODE_PLACEHOLDER_1

Buat intent dan tambahkan header ekstra:

MULTI_LINE_CODE_PLACEHOLDER_2

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

Sebaiknya panggil CustomTabsClient.warmup(). Hal ini memungkinkan aplikasi {i>browser<i} untuk 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. Kami menyiapkan onRelationshipValidationResult() untuk meluncurkan CustomTabsIntent yang dibuat sebelumnya setelah verifikasi origin berhasil.

MULTI_LINE_CODE_PLACEHOLDER_4

Mengikat koneksi layanan tab khusus

Mengikat layanan akan meluncurkan layanan dan onCustomTabsServiceConnected() koneksi pada akhirnya akan dipanggil. Jangan lupa untuk memisahkan layanan dengan benar. Mengikat dan melepas 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 Khusus di sini. Lihat Repositori GitHub android-browser-helper untuk aplikasi contoh yang berfungsi.

Ringkasan

Panduan ini mendemonstrasikan cara menambahkan header arbitrer ke permintaan CORS tab khusus. header yang disetujui dapat dilampirkan ke setiap permintaan CORS tab kustom. Header yang tidak disetujui akan umumnya dianggap tidak aman dalam permintaan CORS dan chrome memfilternya secara default. Melampirkannya adalah hanya diizinkan untuk klien dan server yang asalnya sama, diverifikasi dengan link aset digital.