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.

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.
Setiap perangkat punya kemampuan biometrik yang berbeda. Cek dulu sebelum meminta autentikasi:
<?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
}<?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.
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:
<?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.
Implementasikan flow login: user login dengan password pertama kali, lalu bisa mengaktifkan biometrik untuk login berikutnya:
<?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.
Inti yang harus dibawa pulang:
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!