# 🔐 Auth Verification Flow – GIS Crime App Dokumentasi ini merinci alur autentikasi aplikasi termasuk biometric login, verifikasi identitas (NIK/KTP untuk user & NRP/KTA untuk officer), serta sistem anti-spam panic button dan auto-ban. --- ## 1. Biometric Login (Fingerprint / Face ID) ### 📍 Tujuan: Mempercepat login pengguna dengan otentikasi biometrik. ### 🔄 Alur: 1. App diluncurkan. 2. Cek token atau NIK/NRP di `secure_storage`. 3. Jika tersedia → munculkan biometric prompt. 4. Jika autentikasi sukses → login otomatis ke homepage. 5. Jika gagal → redirect ke halaman login manual. ### 🔧 Teknologi: - `local_auth` (Flutter) - `flutter_secure_storage` --- ## 2. Registrasi dengan Verifikasi NIK (User) atau NRP (Officer) ### 📍 Tujuan: Mencegah spam akun dan memastikan pengguna adalah individu sah. ### 🔄 Alur: 1. User mengisi form registrasi: - Email, password - NIK (user) atau NRP (officer) - Upload foto KTP/KTA (opsional) - Validasi format NIK/NRP - Cek apakah NIK/NRP sudah ada di database. - Jika `is_banned = true` → tolak registrasi. - Jika valid → simpan user baru. ### 🔧 Teknologi: - Supabase/PostgreSQL (unique index + ban flag) - Flutter form + validasi lokal --- ## 3. Verifikasi KTP/KTA (Opsional) ### 📍 Tujuan: Validasi lanjutan jika diperlukan (manual atau otomatis). ### 🅱️ Otomatis (OCR): - Gunakan `google_mlkit_text_recognition` dan sejenisnya - Ekstrak teks dari foto KTP atau KTA - Cocokkan dengan data yang dimasukkan --- ## 4. Anti-Spam Panic Button + Auto Ban ### 📍 Tujuan: Menghindari penyalahgunaan fitur panic alert. ### 🔄 Alur: 1. User menekan panic button. 2. Backend: - Hitung jumlah panic alert dari user dalam 5 menit terakhir. - Jika > 3 → tambahkan `panic_strike`. - Jika `panic_strike >= 3` → set `is_banned = true`. 3. Saat user login atau mendaftar: - Cek `is_banned` berdasarkan NIK/NRP. - Jika ya → tolak akses. # 📍 Location & Anti-Fake GPS Flow – GIS Crime App Dokumentasi ini merinci bagaimana sistem memverifikasi lokasi pengguna dan melindungi fitur penting seperti registrasi dan panic button dari penyalahgunaan melalui fake GPS (location spoofing). --- ## teknologi geolocator geocoding ## 🚦 1. REGISTRASI FLOW (NEW USER) ### 🔄 Alur: 1. 📲 User membuka halaman registrasi 2. 📍 Aplikasi meminta akses lokasi 3. ✅ Jika lokasi berhasil didapat: - Periksa apakah `position.isMocked == false` - Konversi koordinat → nama kota - Jika kota **"Jember"**: - Lanjutkan proses registrasi - Jika **bukan Jember**: - Tampilkan alert: *"Registrasi hanya tersedia di wilayah Jember."* - Blokir pendaftaran 4. ❌ Jika `position.isMocked == true`: - Blokir pendaftaran - Tambahkan flag `spoofing_attempt = true` (opsional) --- ## 🚨 2. PANIC BUTTON FLOW ### 🔄 Alur: 1. 📲 User membuka halaman Panic Button 2. 📍 Aplikasi: - Ambil posisi GPS terkini - Periksa: - `isMocked == false` - Lokasi berada di wilayah Jember 3. ✅ Jika valid: - Panic button aktif 4. ❌ Jika: - Lokasi palsu (`isMocked == true`) - Atau lokasi di luar Jember - → Panic button **dinonaktifkan** - Tampilkan alert: *"Fitur Panic tidak dapat digunakan di luar Jember."* 5. ⚠️ Jika user mencoba spam dari lokasi palsu: - Tambahkan `spoofing_strike += 1` - Jika `spoofing_strike >= 2` → `is_banned = true` --- ### 🔧 Database Fields (liat schema.prisma untul lebih detail): ```sql users: ..... - is_banned BOOLEAN - ban_reason TEXT - panic_strike INT - profile ...... - nik officer: - nrp TEXT UNIQUE - is_banned BOOLEAN - ban_reason TEXT - panic_strike INT panic_logs: - user_id UUID - timestamp TIMESTAMP - location POINT ``` Splash Screen ↓ Token Valid? ┌─────────────┐ │ Ya │ → Biometric Prompt │ Tidak │ └─────┬───────┘ ↓ Onboarding Completed? ┌─────────────┐ │ Ya │ → geolocator verification │ Tidak │ → Tampilkan Onboarding └─────┬───────┘ ↓ Location Valid? ┌─────────────┐ │ Ya │ → Role Selection │ Tidak │ → Tampilkan Sreen warning geolocator └─────┬───────┘ ↓ Role Selection ↓ Registrasi Step Form (NIK/NRP + Upload KTP/KTA + OCR AI untuk validasi KTP/KTA) ↓ Submit & Buat Akun ↓ Login Manual ↓ Login Success? ┌─────────────┐ │ Ya │ → Home sesuai Role │ Tidak │ → Tampilkan Error └─────────────┘