Gereksinimler ve Ön Hazırlık
Başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Flutter 3.24 ve üzeri sürümler, yerel modüllerle daha kararlı çalışmaktadır. Projenizde kullanacağımız temel paket local_auth kütüphanesidir.
- Flutter SDK (3.24 veya daha yeni sürüm)
- Android için Min SDK: 23 (Android 6.0+)
- iOS için Deployment Target: 12.0+
- Fiziksel bir cihaz (Biyometrik sensörler emülatörlerde tam performanslı çalışmayabilir)
Projenizin pubspec.yaml dosyasına gerekli bağımlılığı ekleyerek işe başlayalım:
dependencies:
flutter:
sdk: flutter
local_auth: ^2.2.0
Bağımlılığı ekledikten sonra terminalinizde flutter pub get komutunu çalıştırarak paketleri projenize dahil edin.
Adım Adım Proje Yapılandırması
Biyometrik servislerin çalışabilmesi için mobil platformların izin sistemlerini (Permissions) yapılandırmanız gerekir. Android için android/app/src/main/AndroidManifest.xml dosyasında şu izni ekleyin:
iOS tarafında ise ios/Runner/Info.plist dosyasına kullanıcıya gösterilecek mesajı eklemelisiniz:
NSFaceIDUsageDescription
Uygulamaya giriş yapmak için yüz taraması gereklidir.
Bu izinler, işletim sisteminin uygulamaya biyometrik donanıma erişim yetkisi vermesini sağlar. Eğer bu izinleri eklemezseniz, uygulama çalışma zamanında (runtime) hata verecektir.
Biyometrik Servis Sınıfı Oluşturma
Kodunuzu temiz tutmak adına, biyometrik işlemleri yönetecek bir servis sınıfı oluşturun. Bu sınıf, cihazın biyometrik desteği olup olmadığını kontrol edecek ve doğrulama işlemini tetikleyecektir.
import 'package:local_auth/local_auth.dart';
class BiometricService {
final LocalAuthentication _auth = LocalAuthentication();
Future isDeviceSupported() async {
return await _auth.isDeviceSupported();
}
Future authenticate() async {
try {
return await _auth.authenticate(
localizedReason: 'Lütfen kimliğinizi doğrulayın',
options: const AuthenticationOptions(
biometricOnly: true,
stickyAuth: true,
),
);
} catch (e) {
return false;
}
}
}
Buradaki stickyAuth parametresi, uygulama arka plana atıldığında doğrulama işleminin devam etmesini sağlar. biometricOnly ise şifre yerine sadece biyometrik veri (parmak izi/yüz) zorunluluğu getirir.
Biyometrik Yöntemlerin Karşılaştırılması
Mobil uygulamalarda kullanılan farklı biyometrik yöntemlerin avantaj ve dezavantajlarını anlamak, doğru mimariyi kurmanıza yardımcı olur.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Parmak İzi | Hızlı ve yaygın | Islak ellerde hata verebilir |
| Yüz Tanıma | Temassız ve modern | Düşük ışıkta zorlanabilir |
Uygulama İçinde Kullanıcı Arayüzü Entegrasyonu
Şimdi oluşturduğumuz servisi bir buton ile tetikleyelim. Kullanıcı "Giriş Yap" butonuna bastığında biyometrik doğrulama ekranı açılacaktır.
ElevatedButton(
onPressed: () async {
final service = BiometricService();
bool authenticated = await service.authenticate();
if (authenticated) {
// Başarılı giriş işlemleri
} else {
// Hata mesajı göster
}
},
child: const Text("Biyometrik Giriş"),
)
Bu kod bloğu, servisin döndürdüğü boolean değerine göre yönlendirme yapmanızı sağlar. Başarılıysa ana sayfaya, değilse bir uyarı mesajına yönlendirebilirsiniz.
Güvenlik Uyarısı: Biyometrik doğrulama, cihazın yerel güvenli alanında (Secure Enclave / TEE) saklanır. Uygulamanız asla biyometrik verinin kendisine erişemez; sadece işletim sisteminden "başarılı" veya "başarısız" cevabı alır. Hassas verilerinizi şifrelemek için
flutter_secure_storagepaketini kullanmayı ihmal etmeyin.
Hata Yönetimi ve Debug İpuçları
Biyometrik işlemler sırasında kullanıcı cihazında parmak izi tanımlamamış olabilir veya işlemi iptal edebilir. Bu durumları yönetmek için PlatformException yakalamak önemlidir.
try {
// Doğrulama kodu
} on PlatformException catch (e) {
print("Hata kodu: ${e.code}");
// Hata koduna göre kullanıcıya özel geri bildirim verin
}
Yaygın hata kodları arasında notEnrolled (cihazda kayıtlı biyometrik veri yok) ve lockedOut (çok fazla başarısız deneme) bulunur.
Sıkça Sorulan Sorular
Biyometrik doğrulama verileri sunucuda mı tutulur?
Hayır, biyometrik veriler tamamen kullanıcının cihazındaki donanım seviyesindeki güvenli alanda tutulur ve asla dışarı çıkarılmaz.
Emülatörde test yapabilir miyim?
Emülatörlerde biyometrik sensör simülasyonu sınırlıdır. En sağlıklı test yöntemi, fiziksel bir cihaz üzerinde hata ayıklama (debug) yapmaktır.
Uygulama arka plana atıldığında oturum kapanmalı mı?
Güvenlik gereği, biyometrik korumalı uygulamalarda uygulama her ön plana çıktığında tekrar doğrulama istenmesi tavsiye edilir.
Hangi cihazlar desteklenir?
Modern Android cihazların %95'i ve tüm FaceID/TouchID destekli iOS cihazlar bu servisle uyumludur.
Doğrulama başarısız olursa ne yapmalıyım?
Kullanıcıya alternatif olarak PIN kodu veya şifre ile giriş yapma seçeneği sunmak, kullanıcı deneyimi açısından en iyi pratiktir.
Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) alacağınız uygulamalarda, verilerin şifrelenmesi ve güvenlik protokollerinin uygulanması tamamen geliştiricinin sorumluluğundadır. Uygulamanızın güvenlik denetimlerini bağımsız bir güvenlik uzmanına yaptırmanız önerilir.
Biyometrik Doğrulama İçin İleri Seviye Güvenlik Stratejileri
Biyometrik verilerin cihazda tutulması güvenli olsa da, uygulamanızın genel güvenlik mimarisini güçlendirmek için birkaç ileri seviye teknik uygulamanız gerekir. Özellikle "Man-in-the-Middle" (MitM) saldırılarına karşı SSL Pinning kullanımı ve yerel verilerin şifrelenmesi kritik öneme sahiptir.
Güvenli Depolama (Secure Storage) ile Entegrasyon
Biyometrik doğrulama başarılı olduktan sonra, uygulamanızın hassas verilerini (örneğin API anahtarları veya kullanıcı tokenları) doğrudan SharedPreferences veya UserDefaults içinde saklamamalısınız. Bunun yerine flutter_secure_storage paketini kullanarak, biyometrik doğrulama sonrası kilidi açılan verileri şifreli bir alanda tutmalısınız.
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class SecureStorageService {
final _storage = const FlutterSecureStorage();
Future saveAuthToken(String token) async {
await _storage.write(key: 'user_token', value: token);
}
Future getAuthToken() async {
return await _storage.read(key: 'user_token');
}
}
Performans Optimizasyonu ve Kullanıcı Deneyimi (UX)
Biyometrik doğrulama süreçleri bazen cihazın donanım tepkisine bağlı olarak gecikmeli çalışabilir. Kullanıcıyı bekletmemek ve uygulamanızın akışını bozmamak için şu stratejileri izleyin:
- Doğrulama Zaman Aşımı: Kullanıcının biyometrik pencereyi açık bırakıp gitmesi durumunda, belirli bir süre sonra (örneğin 30 saniye) işlemi otomatik iptal edin.
- Geri Dönüş Yöntemleri: Biyometrik doğrulama başarısız olduğunda veya kullanıcı vazgeçtiğinde, PIN kodu veya desen kilidi gibi alternatif bir yönteme geçişi mutlaka sunun.
- Arka Plan İşlemleri: Biyometrik doğrulama devam ederken uygulamanın ana ekranını bulanıklaştırmak (Blur effect) veya bir "overlay" ile kapatmak, güvenlik açısından profesyonel bir yaklaşımdır.
Hata Ayıklama ve Loglama
Üretim ortamında biyometrik hataları takip etmek için local_auth tarafından dönen hata kodlarını (PlatformException) merkezi bir loglama servisine (Firebase Crashlytics gibi) göndermek, cihaz bazlı uyumsuzlukları hızlıca tespit etmenizi sağlar.
try {
bool authenticated = await auth.authenticate(
localizedReason: 'Giriş yapmak için biyometrik doğrulama gerekli',
);
} on PlatformException catch (e) {
// Hata kodlarını loglayın
print("Hata Kodu: ${e.code}, Mesaj: ${e.message}");
if (e.code == 'NotEnrolled') {
// Kullanıcı henüz cihazına parmak izi/yüz tanımlamamış
}
}
İpucu: Biyometrik doğrulama süreçlerini test ederken, gerçek cihazlarda "Face ID" veya "Parmak İzi" sensörlerinin temiz olduğundan ve emülatör yerine fiziksel cihazlarda test yapıldığından emin olun.
Sonuç
Flutter & mobil ile biyometrik kimlik doğrulama servisi oluşturmak, uygulamanızın güvenlik standartlarını bir üst seviyeye taşır. local_auth kütüphanesi ile cihazın donanım yeteneklerini kullanarak, kullanıcılarınıza hem hızlı hem de güvenli bir deneyim sunabilirsiniz. Bir sonraki adım olarak, biyometrik doğrulama sonrası sunucunuzdan bir JWT (JSON Web Token) alarak oturumu kalıcı hale getiren bir yapı kurmayı deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz