Kunci API rahasia di aplikasi Expo: apa yang dilindungi
Oleh Mehdi Azizi
Diperbarui , 7 mnt
Kunci publik Supabase, secret server, variabel Expo: bedakan apa yang boleh ikut di aplikasi iPhone kamu dan uji aksesnya dengan dua akun.
Variabel lingkungan belum tentu sebuah rahasia
Di aplikasi Expo, variabel berawalan EXPO_PUBLIC_ ditujukan untuk kode aplikasi. Variabel ini tidak boleh berisi secret server. Expo menjelaskan bahwa nilai-nilai ini disematkan ke JavaScript hasil kompilasi dan bisa dibaca oleh pengguna aplikasi. Jadi, memindahkan kunci ke file .env saja tidak cukup untuk melindunginya. Sumber: variabel lingkungan Expo.
Sebelum meminta AI untuk "menyambungkan API", klasifikasikan dulu apa yang kamu berikan: alamat layanan, kunci yang memang dirancang untuk publik, atau kunci yang mengizinkan tindakan istimewa. Klasifikasi ini menentukan di mana kode harus dijalankan.
Tabel berikut adalah panduan desain, bukan audit aplikasimu.
| Elemen | Di mana menaruhnya | Yang perlu dicek |
|---|---|---|
| Alamat publik backend | Konfigurasi aplikasi | Alamat mengarah ke lingkungan yang benar. |
| Kunci Supabase publishable, atau kunci anon lama | Aplikasi, jika otorisasi dikonfigurasi dengan benar | Aturan data benar-benar memblokir akses ke akun pengguna lain. |
| Kunci Supabase secret atau service_role | Hanya di server | Tidak muncul di bundle mobile, maupun di log yang bisa diakses klien. |
| Kunci rahasia penyedia AI | Hanya di server | Aplikasi memanggil servermu, yang memeriksa pengguna dan batasan sebelum ke penyedia. |
Supabase membedakan kunci untuk klien dari kunci rahasia untuk lingkungan tepercaya. Kunci publik mengidentifikasi proyek; kunci ini tidak menggantikan izin atas data. Sumber: kunci API Supabase.
Contoh: aplikasi fiktif catatan bacaan
Bayangkan sebuah aplikasi tempat Léa dan Sami mencatat buku dan catatan pribadi mereka. Contoh ini untuk menyiapkan pengujian; bukan hasil yang didapat dari aplikasi Devoria.
Alur normalnya tampak benar: Léa login dan melihat catatannya. Tapi ini belum menjawab pertanyaan penting: apakah server menolak permintaan Léa yang menyasar catatan Sami?
Filter di antarmuka, seperti "tampilkan catatan pengguna yang login", memperbaiki tampilan. Otorisasi juga harus diterapkan di sisi data. Di Supabase, aturan Row Level Security memungkinkan pembatasan baris yang bisa diakses berdasarkan sesi. Supabase menyarankan untuk mengaktifkannya pada tabel yang diekspos lewat API dan menjelaskan kebijakan baca dan tulis. Sumber: Row Level Security.
Untuk proyek ujimu sendiri, kaitkan setiap catatan dengan pemiliknya dan tentukan secara terpisah siapa yang boleh membaca, membuat, mengubah, dan menghapusnya. Cek juga file: melindungi baris database tidak membuktikan bahwa sebuah gambar bersifat privat.
Skenario uji dengan dua akun tes
Siapkan dua akun yang kamu kendalikan, satu buku berbeda di masing-masing, dan satu catatan kecil yang mudah dikenali. Gunakan data fiktif di lingkungan uji yang diizinkan.
- Membaca catatan sendiri. Akun A menemukan catatan A.
- Membaca catatan B dari A. Permintaan tidak membocorkan isi privatnya.
- Mengubah catatan B dari A. Server menolak; catatan B tetap tidak berubah.
- Membuat atas nama B dari A. Server menolak atribusi ini.
- Membaca tanpa sesi. Tidak ada konten privat yang dikembalikan.
- Membuka file privat B dari A. File tidak bisa diakses.
Catat hasil sebenarnya, versi yang diuji, dan error jika ada. "Aturannya sudah aktif" bukan hasil pengujian. Lembar uji yang tersedia di halaman sumber daya bisa jadi dasar untuk menyimpan bukti-bukti ini.
Lewatkan panggilan berbayar melalui servermu
Untuk fitur yang merangkum buku dengan API AI, alurnya bisa begini: aplikasi → servermu → penyedia → servermu → aplikasi. Kunci rahasia tetap di server. Arsitektur ini saja tidak cukup: akses ke server juga harus dikontrol.
Dalam contoh fiktif ini, server antara lain harus memeriksa sesi, memastikan buku itu milik orang tersebut, membatasi permintaan berulang, dan mengembalikan error yang mudah dipahami jika penyedia tidak merespons. Klien tidak memutuskan sendiri bahwa seorang pengguna punya akses berbayar.
Siapkan empat uji: pengguna belum login, buku milik akun lain, batas tercapai, dan penyedia tidak tersedia. Uji terakhir memastikan aplikasi keluar dari status loading tanpa kehilangan input.
Apa yang bisa kamu minta ke asisten kodingmu
Berikut instruksi review yang bisa kamu sesuaikan dengan repositorimu, tanpa menempelkan nilai rahasiamu:
Daftarkan variabel yang digunakan oleh kode mobile dan oleh server, tampilkan hanya namanya. Identifikasi panggilan istimewa yang ada di sisi klien. Untuk data privat, jelaskan kontrol baca dan tulis, lalu usulkan skenario uji dengan dua akun tes. Jangan lakukan rotasi kunci atau perubahan produksi apa pun tanpa persetujuan.
Baca jawabannya bersama kode terkait. Asisten bisa menemukan ketidakkonsistenan; jawabannya tidak menggantikan menjalankan pengujian. Panduan membuat aplikasi dengan Claude Code menjelaskan cara memecah pekerjaan ini.
Sebelum melanjutkan aplikasimu
Kamu harus bisa menjelaskan tiga hal dengan sederhana: nilai mana yang publik, operasi mana yang lewat server, dan uji mana yang membuktikan satu akun tidak bisa melihat data akun lain. Kalau salah satunya masih kabur, perjelas dulu sebelum menambah fitur.
Halaman membuat aplikasi iPhone menempatkan tahap ini dalam proyek secara utuh. Untuk maju secara berurutan, iOS Kit menawarkan alur empat tahap dan kode awal yang sudah mencakup akun dan AI. Kalau kamu bingung harus lanjut dari tahap mana, diagnosis gratis akan merapikan urutan proyekmu dan mengirimkan checklist anti-penolakan Apple milikku.
Pertanyaan umum
Di mana menaruh kunci API rahasia di aplikasi Expo?
Di servermu, jangan pernah di aplikasi. Kunci Supabase secret atau service_role, juga kunci rahasia penyedia AI, harus tetap hanya di sisi server. Aplikasi memanggil servermu, yang memeriksa pengguna dan batasan sebelum memanggil penyedia. Pastikan tidak ada satu pun kunci ini yang muncul di bundle mobile maupun di log yang bisa diakses klien.
Apakah file .env melindungi kunci API saya di Expo?
Tidak dengan sendirinya. Variabel berawalan EXPO_PUBLIC_ ditujukan untuk kode aplikasi dan tidak boleh berisi secret server. Expo menjelaskan bahwa nilai-nilai ini disematkan ke JavaScript hasil kompilasi dan bisa dibaca oleh pengguna aplikasi. Jadi, memindahkan kunci ke file .env saja tidak cukup untuk melindunginya.
Apa bedanya kunci API publik dan kunci rahasia?
Kunci publik memang dirancang untuk ikut di aplikasi: kunci ini mengidentifikasi proyek, tapi tidak menggantikan izin atas data. Kunci rahasia mengizinkan tindakan istimewa dan hanya untuk lingkungan tepercaya. Di Supabase, kunci publishable, atau kunci anon lama, boleh ada di aplikasi jika otorisasi dikonfigurasi dengan benar. Kunci secret dan service_role tetap di server.
Bagaimana memanggil API AI dari aplikasi Expo tanpa membocorkan kunci?
Lewatkan panggilan melalui servermu: aplikasi memanggil server, server memanggil penyedia lalu mengembalikan jawabannya ke aplikasi. Kunci rahasia tetap di server. Server juga harus memeriksa sesi, membatasi permintaan berulang, dan mengembalikan error yang mudah dipahami jika penyedia tidak merespons. Klien tidak memutuskan sendiri bahwa seorang pengguna punya akses berbayar.
Bagaimana memastikan setiap pengguna hanya melihat datanya sendiri?
Siapkan dua akun tes yang kamu kendalikan, dengan satu catatan yang mudah dikenali di masing-masing. Dari akun A, coba baca, ubah, dan buat atas nama akun B, lalu buka file privat B. Lakukan juga uji tanpa sesi: setiap permintaan harus ditolak atau tidak membocorkan apa pun. Catat hasil sebenarnya, karena "aturannya sudah aktif" bukan hasil pengujian.
Bagaimana meminta AI memeriksa kunci di aplikasi saya?
Minta AI mendaftarkan variabel di kode mobile dan server, tampilkan hanya namanya, tanpa menempelkan nilai rahasiamu. Minta juga untuk mengidentifikasi panggilan istimewa di sisi klien dan mengusulkan skenario uji dengan dua akun tes. Larang rotasi kunci atau perubahan produksi apa pun tanpa persetujuan. Jawabannya tidak menggantikan menjalankan pengujian.