Belajar NativePHP - Biometrics & Secure Storage
Episode 7 of 28

Belajar NativePHP - Biometrics & Secure Storage

Implementasi autentikasi biometrik (Face ID, Touch ID, fingerprint) via Biometric facade, serta secure storage untuk token dan secret menggunakan Keychain (iOS) / Keystore (Android) — dengan studi kasus login biometrik end-to-end.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 6 kita mengakses kamera dan media via Camera facade, pada episode ini kita naik ke level keamanan yang lebih tinggi: autentikasi biometrik dan secure storage. Di dunia mobile, biometrik (Face ID, Touch ID, fingerprint) bukan lagi fitur premium — ia menjadi ekspektasi standar untuk aplikasi yang menangani data sensitif.

NativePHP menyediakan facade Biometric untuk autentikasi dan facade Keychain/Keystore untuk menyimpan secret secara aman — semuanya dipanggil dari PHP tanpa perlu menulis Swift atau Kotlin.

Biometric Facade

Mengecek Ketersediaan

Setiap perangkat punya kemampuan biometrik yang berbeda. Cek dulu sebelum meminta autentikasi:

Cek kemampuan biometrik
<?php
 
use Native\Laravel\Facades\Biometric;
 
// Cek apakah perangkat mendukung biometrik
$supported = Biometric::isSupported();
 
// Cek apakah biometrik sudah terdaftar di perangkat
$enrolled = Biometric::areBiometricsEnrolled();
 
if ($supported && $enrolled) {
    // Lanjut ke autentikasi
}

Meminta Autentikasi

Autentikasi biometrik
<?php
 
use Native\Laravel\Facades\Biometric;
 
$result = Biometric::authenticate(
    'Gunakan fingerprint untuk membuka aplikasi'
);
 
if ($result->success) {
    // Autentikasi berhasil
    session()->put('biometric_auth', true);
    return redirect()->to('/dashboard');
} else {
    // Autentikasi gagal atau dibatalkan
    session()->flash('error', 'Autentikasi biometrik gagal');
}

Pesan yang ditampilkan di dialog biometrik ('Gunakan fingerprint...') harus jelas dan informatif. iOS dan Android akan menampilkannya di dialog bawaan platform.

Secure Storage: Keychain & Keystore

Menyimpan token atau secret di SharedPreferences atau SQLite tidak aman — data ini bisa di-read dari rooted/jailbroken device. NativePHP menggunakan secure storage bawaan platform:

  • iOS: Keychain Services — data terenkripsi dan hanya bisa diakses oleh aplikasi yang sama.
  • Android: EncryptedSharedPreferences atau Keystore — data terenkripsi dengan hardware-backed key.

Menyimpan dan Membaca Secret

Secure storage untuk token
<?php
 
use Native\Laravel\Facades\SecureStorage;
 
// Simpan token
SecureStorage::put('auth_token', 'eyJhbGciOiJIUzI1NiIs...');
 
// Baca token
$token = SecureStorage::get('auth_token');
 
// Hapus token
SecureStorage::forget('auth_token');
 
// Cek ada tidaknya
$exists = SecureStorage::has('auth_token');

SecureStorage::put() mengenkripsi data menggunakan hardware-backed key perangkat. Data ini bertahan meskipun aplikasi di-uninstall (kecuali forget() dipanggil), dan tidak bisa diakses oleh aplikasi lain.

Studi Kasus: Login Biometrik End-to-End

Implementasikan flow login: user login dengan password pertama kali, lalu bisa mengaktifkan biometrik untuk login berikutnya:

app/Livewire/BiometricLogin.php
<?php
 
namespace App\Livewire;
 
use Livewire\Component;
use Native\Laravel\Facades\Biometric;
use Native\Laravel\Facades\SecureStorage;
use Illuminate\Support\Facades\Http;
 
class BiometricLogin extends Component
{
    public $email = '';
    public $password = '';
    public $biometricEnabled = false;
 
    public function mount()
    {
        $this->biometricEnabled = SecureStorage::has('biometric_credentials');
    }
 
    public function loginWithPassword()
    {
        $this->validate([
            'email' => 'required|email',
            'password' => 'required|min:6',
        ]);
 
        $response = Http::post('https://api.myapp.com/auth/login', [
            'email' => $this->email,
            'password' => $this->password,
        ]);
 
        if ($response->successful()) {
            $token = $response->json('token');
 
            // Simpan kredensial di secure storage
            SecureStorage::put('auth_token', $token);
            SecureStorage::put('user_email', $this->email);
 
            // Tawarkan aktivasi biometrik
            if (Biometric::isSupported() && Biometric::areBiometricsEnrolled()) {
                $this->dispatch('show-biometric-prompt');
            } else {
                $this->goToDashboard();
            }
        }
    }
 
    public function enableBiometric()
    {
        SecureStorage::put('biometric_enabled', 'true');
        $this->biometricEnabled = true;
        $this->goToDashboard();
    }
 
    public function loginWithBiometric()
    {
        $result = Biometric::authenticate(
            'Login ke aplikasi dengan biometrik'
        );
 
        if ($result->success) {
            $token = SecureStorage::get('auth_token');
            // Gunakan token yang tersimpan
            $this->goToDashboard();
        }
    }
 
    private function goToDashboard()
    {
        return redirect()->to('/dashboard');
    }
 
    public function render()
    {
        return view('livewire.biometric-login');
    }
}

Important

Jangan menyimpan password plaintext di secure storage — simpan hanya token sesi. Password harus dikirim ke backend untuk divalidasi, dan backend yang mengembalikan token. Secure storage melindungi data di perangkat, bukan di jaringan.

Penutup

Inti yang harus dibawa pulang:

  • Biometric::isSupported() dan areBiometricsEnrolled() harus dicek sebelum meminta autentikasi.
  • Biometric::authenticate() menampilkan dialog biometrik bawaan platform.
  • SecureStorage menggunakan Keychain (iOS) / Keystore (Android) — data terenkripsi hardware-backed.
  • Simpan token, bukan password, di secure storage.
  • Pola login: password pertama kali → offer biometrik → login berikutnya pakai biometrik.

Di episode 8 selanjutnya, kita akan membahas Notifications: Push & Local — registrasi device token (APNs/FCM), konfigurasi sertifikat, handling payload & tap action, serta mengirim push test dari backend Laravel. Sampai jumpa di episode 8!

Belajar NativePHP - Biometrics & Secure Storage | Belajar NativePHP