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
Menyiapkan Digital Asset Links
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
Menyiapkan Koneksi Tab Kustom untuk Memvalidasi Penautan Aset
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.