191 lines
4.7 KiB
Markdown
191 lines
4.7 KiB
Markdown
# 🔐 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
|
||
└─────────────┘ |