Aplikasi Expo gagal HTTP di Android 9: ini cleartext, bukan VPN
Build Expo yang memanggil API HTTP biasa gagal di Android 9 dan setelahnya. Tunnelnya tidak bersalah: flag cleartext ada di konfigurasi build.
Anda merilis build baru, berpindah ke VPN, dan layar yang sama berhenti memuat. Di Android 9 dan setelahnya, penjelasan yang lebih umum justru lebih membosankan: platform menolak HTTP biasa untuk aplikasi yang menargetkan API 28 atau lebih tinggi, dan VPN hanya mengubah cukup konteks untuk memunculkannya. Galat yang Anda lihat bergantung pada klien HTTP, karena itu ia sangat jarang menyebut cleartext.
Apa sebenarnya kegagalan ini
Sejak Android 9 platform memblokir cleartext secara default begitu sebuah aplikasi menargetkan level API 28 atau lebih tinggi. Permintaan ke alamat HTTP biasa ditolak platform sebelum satu paket pun meninggalkan perangkat. Galat mana yang Anda lihat bergantung pada pustaka HTTP: kadang kegagalan jaringan umum, kadang waktu habis, kadang pesan yang menyebut cleartext secara langsung. Yang tidak pernah dilakukannya adalah mencapai server Anda. Android mendokumentasikan default dan alternatif yang dibatasi domain di panduan konfigurasi keamanan-nya.
Browser di perangkat yang sama masih bisa memuat halaman, dan itulah petunjuk yang paling banyak orang lewatkan. Browser tidak tunduk pada kebijakan keamanan jaringan aplikasi Anda.
Mengapa VPN yang disalahkan
Biasanya tiga hal berubah sekaligus. Aplikasi mungkin me-resolve nama host berbeda setelah VPN tersambung, perangkatnya mungkin baru dengan build lebih baru, atau build-nya sendiri mungkin telah berpindah ke level API target yang memicu default. VPN terlihat dan SDK target tidak, jadi VPN yang mendapat tiket.
Bandingkan level target build lama dan baru sebelum menyentuh konfigurasi jaringan. Aplikasi yang menargetkan 27 atau lebih rendah dikecualikan, dan itu menjelaskan semua laporan «di ponsel lama saya jalan».
Ke mana flag Expo sebenarnya mendarat
Di proyek Expo terkelola, menambahkan pengaturan ke app.json tidak menyunting manifes Android, karena prebuild dan build pengembanganlah yang menghasilkan manifes. Plugin konfigurasi adalah yang menulis pengaturan itu pada tahap tersebut. Jalur yang didukung adalah expo-build-properties, dikonfigurasi di konfigurasi aplikasi dengan opsi cleartext di bawah android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Cuplikan itu hanya menyetel opsi plugin; manifes dihasilkan kemudian. Jalankan prebuild atau build klien pengembangan yang segar, lalu sebelum menguji ulang periksa AndroidManifest.xml yang dihasilkan untuk android:usesCleartextTraffic, karena muat ulang hanya dengan JS mempertahankan manifes lama. Cocokkan versi plugin dengan Expo SDK tempat proyek berjalan. Opsi plugin berpindah antar rilis, dan cuplikan yang disalin dari SDK lain adalah sumber andal untuk no-op senyap.
Alur bare dan opsi yang lebih sempit
Untuk bare React Native padanannya adalah android:usesCleartextTraffic pada elemen application, atau konfigurasi keamanan jaringan yang mengizinkan cleartext hanya untuk domain tertentu. Bentuk yang dibatasi domain adalah yang sebaiknya dipilih, karena ia mengizinkan API internal dan membiarkan sisanya di HTTPS. Ia juga mendokumentasikan daftar pengecualiannya sendiri, dan itulah bagian yang akan ditanyakan peninjau.
Kedua pendekatan itu tidak mengubah default platform untuk apa pun yang tidak Anda sebutkan.
Buktikan dulu dari log perangkat
Sebelum menyunting konfigurasi, dapatkan kegagalan yang tepat. adb logcat pada perangkat yang terhubung memperlihatkan penolakan cleartext dari platform dan menyebut komponen yang memicunya. Socket yang ditolak, nama yang tidak bisa di-resolve, atau jabat tangan TLS yang gagal menunjuk ke tempat yang sama sekali lain, dan mengaktifkan cleartext hanya akan melemahkan aplikasi tanpa alasan.
Lalu jaga produksi tetap jujur. Cleartext dapat diterima untuk endpoint lab yang tidak bisa menyediakan TLS, dan hanya untuk waktu terpendek yang bisa Anda jadwalkan. Jika API bisa mengakhiri TLS di dalam jaringan privat, taruh sertifikat di trust store perangkat dan biarkan cleartext nonaktif, karena tunnel mengenkripsi jalur sampai pintu keluarnya dan tidak lebih.
Setelah endpoint menjawab lewat HTTPS, hapus izinnya, build ulang, dan uji di VPN dan di Wi-Fi biasa dalam sesi yang sama. Resolusi nama bisa berbeda antara kedua jalur itu, dan hanya pasangan itulah yang memberi tahu Anda mana yang mengatakan kebenaran.