Menambahkan Header Permintaan HTTP tambahan

Permintaan HTTP berisi header seperti Agen Pengguna atau Jenis Konten. Selain header yang dilampirkan oleh browser, aplikasi Android dapat menambahkan header tambahan, seperti Cookie atau Perujuk melalui Intent tambahan EXTRA_HEADERS. Untuk alasan keamanan, Chrome memfilter beberapa header tambahan, bergantung pada cara dan tempat 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 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. Dari versi 83 dan seterusnya, Chrome mulai memfilter semua kecuali header lintas origin yang disetujui, karena header yang tidak disetujui dapat menimbulkan risiko keamanan. Mulai Chrome 86, Anda dapat melampirkan header yang tidak tercantum dalam daftar yang disetujui ke permintaan lintas origin, saat server dan klien terkait menggunakan digital asset link. Perilaku ini dirangkum dalam tabel berikut:

Versi Chrome Header CORS diizinkan
sebelum Chrome 83 disetujui, tidak disetujui
Chrome 83 hingga Chrome 85 disetujui
mulai dari Chrome 86 dan seterusnya disetujui, dan 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 membuka Menambahkan Header Tambahan ke Intent Tab Kustom untuk kode.

Latar belakang

Header Permintaan CORS yang tercantum dalam daftar disetujui vs. yang tidak disetujui

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

Header Deskripsi
terima-bahasa mengiklankan bahasa alami yang dipahami klien
bahasa konten mendeskripsikan bahasa yang ditujukan untuk audiens saat ini
jenis-konten menunjukkan jenis media resource

Tabel 2.: Contoh header CORS yang disetujui.

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

Contoh header yang tidak diizinkan ditampilkan di tabel berikut:

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

Tabel 3.: Contoh header CORS yang tidak diizinkan.

Memasang header yang tidak disetujui ke permintaan CORS tidak disarankan oleh standar HTML dan server menganggap bahwa permintaan lintas origin 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 oleh Chrome (atau browser lain) ke permintaan. Cookie tersebut dapat mengautentikasi transaksi server berbahaya yang sebelumnya tidak mungkin dilakukan.

Melampirkan header yang disetujui CORS ke permintaan Tab Khusus

Tab Khusus 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 tanda 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 dapat melampirkan header yang disetujui ke tab khusus permintaan CORS kapan saja. Namun, Chrome memfilter header yang tidak disetujui secara default. Meskipun browser lain mungkin memiliki perilaku yang berbeda, developer mengetahui bahwa header yang tidak disetujui akan diblokir secara umum.

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

Menambahkan Header Tambahan ke Intent Tab Khusus

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

Ikuti panduan resmi untuk menyiapkan digital asset link. Untuk hubungan link, gunakan "delegate_permission/common.use_as_origin"` yang menunjukkan bahwa kedua aplikasi tersebut berasal dari origin yang sama setelah link 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 tersebut berasal dari origin yang sama. Verifikasi hanya berhasil jika link aset digital disiapkan dengan benar.

Sebaiknya panggil CustomTabsClient.warmup(). Hal ini memungkinkan aplikasi browser melakukan inisialisasi awal 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 melepaskan layanan dengan tepat. Binding dan pelepasan binding 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 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 umumnya dianggap tidak aman dalam permintaan CORS dan Chrome akan memfilternya secara default. Pemasangan hanya diizinkan untuk klien dan server dengan asal yang sama, yang diverifikasi dengan link aset digital.