Flutter İle Biyometrik Parmak İzi Doğrulaması Nasıl Yapılır?

Flutter İle Biyometrik Parmak İzi Doğrulaması Nasıl Yapılır?
Flutter İle Biyometrik Parmak İzi Doğrulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projenize biyometrik doğrulama eklemeden önce, geliştirme ortamınızın güncel olduğundan emin olmalısınız. Flutter 3.x ve üzeri sürümler, modern biyometrik API'lerle tam uyumlu çalışmaktadır. Ayrıca, fiziksel bir cihazda test yapmanız kritik önem taşır; çünkü emülatörler biyometrik sensörleri her zaman doğru simüle edemeyebilir.

  • Flutter SDK 3.24 veya üzeri.
  • Android için minSdkVersion en az 23 (Android 6.0).
  • iOS için Info.plist üzerinde FaceID/TouchID kullanım izni.

Projenizin pubspec.yaml dosyasına gerekli bağımlılığı ekleyerek başlayalım. Terminalinize şu komutu yazarak kütüphaneyi projenize dahil edin:

flutter pub add local_auth

Bu komut, yerel kimlik doğrulama işlemlerini yöneten en güncel local_auth paketini projenize ekleyeceidir.

Android ve iOS İçin Yapılandırma Ayarları

Kütüphaneyi eklemek yeterli değildir; işletim sistemi bazlı izinleri de tanımlamanız gerekir. Android tarafında, android/app/src/main/AndroidManifest.xml dosyanıza şu izni eklemelisiniz:

iOS tarafında ise ios/Runner/Info.plist dosyasına, uygulamanın neden biyometrik veriye ihtiyaç duyduğunu açıklayan bir metin eklemelisiniz. Aksi takdirde uygulama onay ekranında çökecektir:

NSFaceIDUsageDescription
Güvenli giriş için parmak izi veya yüz tanıma gereklidir.

Biyometrik Doğrulama Servisi Oluşturma

Kodunuzu temiz tutmak için biyometrik işlemleri ayrı bir servis sınıfında toplamak en iyi pratiktir. Bu sınıf, cihazın biyometrik destekleyip desteklemediğini kontrol edecek ve doğrulama işlemini başlatacaktır.

import 'package:local_auth/local_auth.dart';

class BiometricService {
  final LocalAuthentication _auth = LocalAuthentication();

  Future canAuthenticate() async {
    final bool canCheckBiometrics = await _auth.canCheckBiometrics;
    final bool isDeviceSupported = await _auth.isDeviceSupported();
    return canCheckBiometrics || isDeviceSupported;
  }
}

Yukarıdaki kod, canAuthenticate metodu ile cihazın biyometrik donanıma sahip olup olmadığını kontrol eder. isDeviceSupported metodu, cihazın biyometrik donanım seviyesini doğrular.

Parmak İzi Doğrulama İşlemini Başlatma

Artık doğrulama fonksiyonunu yazabiliriz. Kullanıcıyı biyometrik tarayıcıya yönlendirecek olan authenticate metodunu servis sınıfımıza ekleyelim.

Future authenticateUser() async {
  try {
    return await _auth.authenticate(
      localizedReason: 'Giriş yapmak için parmağınızı okutun',
      options: const AuthenticationOptions(
        biometricOnly: false,
        stickyAuth: true,
      ),
    );
  } catch (e) {
    return false;
  }
}

Buradaki localizedReason, kullanıcıya gösterilecek olan mesajdır. biometricOnly: false ayarı, biyometrik başarısız olursa cihazın kendi PIN/Şifre ekranına düşmesine izin verir.

Kritik Güvenlik Uyarısı: Biyometrik doğrulama, bir kimlik doğrulama katmanıdır ancak tek başına yeterli değildir. Hassas işlemlerde (para transferi vb.) sunucu tarafında doğrulanmış bir JWT (JSON Web Token) veya oturum anahtarı ile birlikte kullanılmalıdır. Biyometrik verinin kendisi cihazda saklanır, uygulamanız bu veriye doğrudan erişemez; sadece "başarılı" veya "başarısız" yanıtını alır.

Biyometrik Yöntemlerin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Parmak İzi Çok hızlı ve yaygın Islak/kirli parmakta hata
Yüz Tanıma Temassız ve modern Düşük ışıkta zorlanabilir
PIN/Şifre En güvenilir yedek Unutulma riski

Uygulama İçinde Kullanım ve Hata Yönetimi

Servisimizi bir buton ile tetikleyelim. Kullanıcının biyometrik verisi yoksa veya cihaz desteklemiyorsa, uygun hata mesajlarını göstermek kullanıcı deneyimi (UX) açısından önemlidir.

void _handleLogin(BuildContext context) async {
  final service = BiometricService();
  bool isAvailable = await service.canAuthenticate();
  
  if (isAvailable) {
    bool isAuthenticated = await service.authenticateUser();
    if (isAuthenticated) {
      // Başarılı giriş işlemleri
    } else {
      // Hata veya iptal durumu
    }
  } else {
    // Biyometrik desteklenmiyor
  }
}

Bu yapı, uygulamanızın biyometrik özelliklere sahip olmayan cihazlarda çökmesini engeller ve kullanıcıyı alternatif yöntemlere yönlendirmenize olanak tanır.

Sıkça Sorulan Sorular

Biyometrik veri uygulamam tarafından mı saklanıyor?

Hayır, biyometrik veriler cihazın "Secure Enclave" veya "Trusted Execution Environment" adı verilen güvenli donanımında saklanır. Uygulamanız sadece işletim sisteminden gelen bir doğrulama sinyali alır.

Emülatörde neden çalışmıyor?

Emülatörlerin büyük çoğunluğu parmak izi sensörünü fiziksel olarak barındırmaz. Testleriniz için mutlaka gerçek bir Android veya iOS cihaz kullanmalısınız.

Kullanıcı biyometrik verisini silerse ne olur?

Uygulamanız authenticate metodunu çağırdığında sistem bir hata döner veya doğrulama başarısız olur. Bu durumda kullanıcıyı uygulama şifresine yönlendiren bir mantık kurmalısınız.

FaceID için ekstra bir ayar gerekir mi?

Hayır, local_auth kütüphanesi FaceID ve TouchID'yi otomatik olarak algılar. Ancak iOS tarafında Info.plist iznini mutlaka belirtmelisiniz.

Birden fazla parmak izi tanımlıysa ne olur?

Sistem, cihazın ayarlarında tanımlı olan herhangi bir parmak izi ile doğrulama yapıldığında size "başarılı" yanıtını döner.

İleri Seviye Güvenlik: Biyometrik Veri ile Şifreleme (Local Authentication & Secure Storage)

Biyometrik doğrulama tek başına bir kimlik kanıtlama yöntemidir; ancak verilerinizi korumak için tek başına yeterli değildir. Gerçek bir uygulama senaryosunda, biyometrik doğrulama başarılı olduğunda, cihazın güvenli alanında (Secure Storage) saklanan bir şifreleme anahtarının kilidini açmanız gerekir. Bu sayede, biyometrik doğrulama sadece bir "anahtar açma" mekanizması olarak çalışır.

Aşağıdaki örnek, flutter_secure_storage ve local_auth kütüphanelerinin birlikte nasıl kullanılacağını göstermektedir:

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:local_auth/local_auth.dart';

class SecureVault {
  final _storage = const FlutterSecureStorage();
  final _auth = LocalAuthentication();

  Future saveSensitiveData(String key, String value) async {
    await _storage.write(key: key, value: value);
  }

  Future getSensitiveData(String key) async {
    bool canAuthenticate = await _auth.canCheckBiometrics || await _auth.isDeviceSupported();
    
    if (canAuthenticate) {
      bool didAuthenticate = await _auth.authenticate(
        localizedReason: 'Verilerinize erişmek için lütfen doğrulama yapın',
      );
      
      if (didAuthenticate) {
        return await _storage.read(key: key);
      }
    }
    return null;
  }
}

Biyometrik Doğrulama Süreçlerinde Hata Ayıklama ve Test Stratejileri

Biyometrik entegrasyonlar, donanım bağımlı oldukları için geliştirme aşamasında en çok hata alınan alanlardan biridir. Uygulamanızın farklı cihazlarda tutarlı çalışması için aşağıdaki test stratejilerini izlemelisiniz:

  • Farklı Donanım Tipleri: Uygulamanızı hem optik parmak izi okuyuculu hem de ultrasonik sensörlü cihazlarda test edin.
  • Hata Kodlarını Yakalama: PlatformException hatalarını mutlaka loglayın. Özellikle lockedOut ve permanentlyLockedOut durumlarını yönetmek, kullanıcı deneyimi açısından kritiktir.
  • Donanım Yokluğu Durumu: Cihazda biyometrik sensör bulunmadığı durumlarda uygulamanın çökmemesi için isDeviceSupported() kontrolünü her zaman doğrulama öncesinde yapın.

Hata Yönetimi Tablosu

Hata Kodu Anlamı Önerilen Aksiyon
lockedOut Çok fazla hatalı deneme yapıldı. Kullanıcıyı 30 saniye bekletin veya PIN girişine yönlendirin.
notEnrolled Cihazda tanımlı biyometrik veri yok. Kullanıcıyı cihaz ayarlarına yönlendirerek parmak izi eklemesini isteyin.
notAvailable Donanım desteklenmiyor. Biyometrik seçeneğini arayüzden gizleyin.

Bu hata kodlarını yönetirken, kullanıcıya "İşlem başarısız" gibi genel ifadeler yerine, "Çok fazla deneme yaptınız, lütfen 30 saniye sonra tekrar deneyin" gibi yönlendirici mesajlar vermek uygulamanızın profesyonellik seviyesini artıracaktır.

Sonuç

Flutter ile biyometrik parmak izi doğrulaması yapmak, doğru kütüphane ve yapılandırma ile oldukça basit ve güvenli bir süreçtir. Bu rehberde öğrendiğiniz yöntemleri kullanarak, kullanıcılarınızın uygulama güvenliğini bir üst seviyeye taşıyabilirsiniz. Bir sonraki adım olarak, başarılı doğrulama sonrasında sunucu tarafında bir oturum (session) oluşturmayı veya yerel veritabanında (Hive/SQLite) şifreli verilerin kilidini açmayı deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamındaki uygulamalarınızda, güvenlik standartlarına (OWASP Mobile Top 10) uygun olarak verilerin şifrelenmesi ve güvenli anahtar yönetimi (KeyStore/Keychain) konularına ayrıca dikkat etmeniz önerilir.
Bu yazıya tepkinizi paylaşın:
Zeynep Sönmez

Dijital içerik üretimi ve teknik rehber hazırlama süreçlerinde uzmanlaşmış bir editörüm. Okuyucuların hayatını kolaylaştıran, adım adım uygulanabilir kılavuzlar yazmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz