Einführung in die biometrische Authentifizierung auf iOS

Die biometrische Authentifizierung ist zu einem Eckpfeiler der modernen mobilen Sicherheit geworden und bietet eine Balance zwischen Komfort und Schutz. Für iOS-Entwickler bietet das LocalAuthentication-Framework eine einfache und dennoch leistungsstarke API zur Integration von Touch ID, Face ID und Gerätepasscode-Verifizierung in Anwendungen. Dieser Artikel durchläuft den gesamten Prozess der Implementierung der biometrischen Authentifizierung mit LocalAuthentication, von der Ersteinrichtung bis hin zu produktionsbereiten Best Practices, um sicherzustellen, dass Ihre App die höchsten Standards für die Privatsphäre und Sicherheit der Benutzer erfüllt.

Am Ende dieses Handbuchs erfahren Sie, wie Sie die biometrische Verfügbarkeit überprüfen, Benutzer zur Authentifizierung auffordern, Fehler anmutig behandeln und Rückfallmechanismen bereitstellen können, während Sie die Apple-Richtlinien für die Privatsphäre und den Datenschutz der Benutzer befolgen.

Das LocalAuthentication Framework verstehen

Das in iOS 8 eingeführte LocalAuthentication-Framework bietet eine einheitliche Schnittstelle zur Bewertung der Benutzeridentität durch Biometrie oder einen Gerätepasscode. Es abstrahiert die zugrunde liegenden Hardwareunterschiede zwischen Touch ID und Face ID, so dass Sie eine Authentifizierungslogik schreiben können, die nahtlos über alle unterstützten iOS-Geräte hinweg funktioniert.

Zu den wichtigsten Komponenten des Rahmens gehören:

  • LAContext: Das zentrale Objekt, das Authentifizierungsrichtlinien, lokalisierte Grundzeichenfolgen und Fallback-Verhalten verwaltet.
  • LAPolicy: Vordefinierte Richtlinien, die die Authentifizierungsmethode bestimmen.
  • LAError: Fehlercodes, die Ihre App darüber informieren, warum die Authentifizierung fehlgeschlagen ist – Biometrie nicht verfügbar, Benutzer abgesagt, Passcode nicht eingestellt und andere.

Während das Framework einfach zu bedienen ist, erfordert die richtige Implementierung eine sorgfältige Aufmerksamkeit auf die Benutzererfahrung, die Fehlerbehandlung und die Sicherheit.

Authentifizierungsrichtlinien erklärt

  • – Wenn die Biometrie (Touch ID oder Face ID) registriert und verfügbar ist, fordert diese Richtlinie den Benutzer nur zur biometrischen Verifizierung auf. Wenn die Biometrie nicht verfügbar ist, schlägt die Richtlinienbewertung fehl, ohne einen Passcode-Fallback anzubieten. Dies ist für Operationen mit geringem Risiko geeignet, bei denen Sie eine reibungslose Erfahrung wünschen und den Mangel an Biometrie anmutig bewältigen können.
  • – Diese Richtlinie versucht zunächst eine biometrische Verifizierung. Wenn die Biometrie nicht verfügbar ist, der Benutzer die Registrierung nicht durchführt oder der Benutzer die biometrische Eingabeaufforderung abbricht, kann Ihre App auf den Gerätepasscode zurückgreifen. Dies ist die empfohlene Richtlinie für die meisten Authentifizierungsszenarien, da sie sicherstellt, dass der Benutzer sich auch dann, wenn die Biometrie keine Option ist, mit seinem Passcode authentifizieren kann.

Es ist wichtig zu beachten, dass der Passcode-Fallback nur erscheint, nachdem der Benutzer die biometrische Eingabeaufforderung abgebrochen hat oder wenn die Biometrie fehlschlägt und der Benutzer auf "Passcode eingeben" tippt.

Schritt-für-Schritt-Implementierung

Die Implementierung der biometrischen Authentifizierung umfasst fünf klare Schritte: Importieren des Frameworks, Erstellen einer -Instanz, Überprüfen, ob die gewünschte Richtlinie ausgewertet werden kann, Durchführen der Bewertung und Bearbeiten des Ergebnisses.

1. Importieren Sie den Rahmen

Beginnen Sie mit dem Import von in jede Swift-Datei, in der Sie die Authentifizierung verwenden möchten.

import LocalAuthentication

2. Erstellen Sie einen LAContext

ist das Objekt, das den Systemzustand abfragt und die Authentifizierungsauswertung durchführt. Sie können optional Eigenschaften wie (die dem Benutzer angezeigte Nachricht) und (der Text für die Fallback-Taste) konfigurieren.

let context = LAContext()
context.localizedFallbackTitle = "Use Passcode"

3. Biometrische Verfügbarkeit prüfen

Bevor Sie den Benutzer auffordern, sollten Sie prüfen, ob die gewählte Richtlinie ausgewertet werden kann. Diese Überprüfung ist wichtig, um einen abrupten Fehler zu vermeiden, der den Benutzer verwirren könnte. Verwenden Sie die -Methode, indem Sie die Richtlinie, die Sie verwenden möchten, übergeben. Die Methode gibt einen Booleschen Wert zurück. Wenn sie zurückgibt, enthält der -Parameter (ein -Zeiger Details darüber, warum eine Auswertung nicht möglich ist.

var error: NSError?
let canEvaluate = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)

if !canEvaluate {
 // Handle the error – see section on error handling below
 print("Authentication not available: \(error?.localizedDescription ?? "Unknown error")")
 return
}

Häufige Gründe für das Versagen sind: Das Gerät unterstützt keine Biometrie, es werden keine Fingerabdrücke oder kein Gesicht registriert, der Gerätepasscode ist nicht festgelegt oder die App hat keinen Anspruch auf Face ID (siehe Best Practices).

4. Bewertung der Politik

Wenn Sie bestätigt haben, dass die Richtlinie ausgewertet werden kann, rufen Sie auf. Der -Parameter ist ein String, der erklärt, warum Ihre App eine Authentifizierung benötigt. Dieser String muss klar und benutzerfreundlich sein, da er in der Systemaufforderung angezeigt wird. Bei Face ID wird immer der Grund angezeigt; bei Touch ID kann er je nach Gerätekonfiguration angezeigt werden.

context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your secure data") { success, evaluateError in
 DispatchQueue.main.async {
 if success {
 // Authentication successful
 print("User authenticated successfully")
 } else {
 // Authentication failed or was cancelled
 print("Authentication failed: \(evaluateError?.localizedDescription ?? "Unknown error")")
 }
 }
}

Beachten Sie, dass der Completement Handler nicht garantiert auf dem Hauptthread läuft.

5. Umgang mit dem Ergebnis

Wenn die Authentifizierung erfolgreich ist, können Sie sicher den Zugriff auf geschützte Inhalte oder Aktionen erlauben. Wenn sie fehlschlägt, müssen Sie die Ursache ermitteln, indem Sie die inspizieren. Der Fehler ist vom Typ , was eine Enum gemäß ist.

  • .userCancel: Der Benutzer tippte auf der biometrischen Eingabeaufforderung auf “Cancel”.
  • .userFallback: The user tapped the fallback button (e.g., “Enter Password”). This triggers the passcode entry if using .deviceOwnerAuthentication, but if you only used .deviceOwnerAuthenticationWithBiometrics, no fallback occurs. In that case, you should present your own passcode entry screen.
  • .biometryNotAvailable: Biometry is not available on this device (e.g., missing hardware). You should switch to passcode-only authentication.
  • .biometryNotEnrolled: No biometric data is enrolled. Prompt the user to set up Touch ID or Face ID in Settings.
  • .biometryLockout: Too many failed attempts; the system has locked biometry. You need to fall back to the passcode. The system passcode will reset the lockout.
  • .passcodeNotSet: The device has no passcode configured. The user must set a passcode for biometry to work. Display an alert directing them to Settings.

Handling each of these cases gracefully is essential for a smooth user experience. For a production app, consider centralising your authentication logic in a manager class and providing clear feedback to the user.

Complete Example with Error Handling

Below is a more complete example that demonstrates a real-world authentication flow. It checks availability, handles errors with appropriate user alerts, and provides a fallback to a custom passcode entry if the user cancels biometry.

import LocalAuthentication
import UIKit

class BiometricAuthManager {
 static let shared = BiometricAuthManager()

 private let context = LAContext()

 func authenticate(completion: @escaping (Bool, String?) -> Void) {
 var error: NSError?
 context.localizedFallbackTitle = "Use Passcode"

 guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else {
 // Determine the reason why authentication is unavailable
 let message = errorMessage(for: error)
 completion(false, message)
 return
 }

 // Possibly show a loading state
 context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your account") { success, evaluateError in
 DispatchQueue.main.async {
 if success {
 completion(true, nil)
 } else {
 let message = self.errorMessage(for: evaluateError as? LAError)
 completion(false, message)
 }
 }
 }
 }

 private func errorMessage(for error: LAError?) -> String {
 guard let error = error else {
 return "Authentication could not be completed."
 }
 switch error.code {
 case .biometryNotAvailable:
 return "Biometric authentication is not available on this device."
 case .biometryNotEnrolled:
 return "No biometric data is enrolled. Please set up Face ID or Touch ID in Settings."
 case .biometryLockout:
 return "Too many failed attempts. Please use your passcode to unlock biometrics."
 case .passcodeNotSet:
 return "A device passcode is required to use biometric authentication."
 case .userCancel:
 return "Authentication cancelled by user."
 case .userFallback:
 return "User chose to use the passcode."
 default:
 return "Authentication failed: \(error.localizedDescription)"
 }
 }
}

Diese Klasse kapselt die Authentifizierungslogik und gibt ein sauberes Erfolgs-/Ausfallergebnis mit einer benutzerfreundlichen Nachricht zurück. Ihre View-Controller können aufrufen und entsprechend reagieren.

Best Practices und Produktionsüberlegungen

Während der oben genannte Code eine solide Grundlage bietet, stellen mehrere zusätzliche Praktiken sicher, dass Ihre Implementierung robust, sicher und benutzerfreundlich ist.

Geben Sie immer einen Passcode Fallback

Selbst wenn Sie die -Richtlinie verwenden, sollten Sie Ihren eigenen Passcode-Eingabebildschirm bereithalten. Viele Benutzer haben möglicherweise keine biometrischen Daten oder bevorzugen es, in bestimmten Situationen einen Passcode zu verwenden. Die Human Interface-Richtlinien von Apple empfehlen, eine klare Alternative zur Biometrie anzubieten.

Verwenden Sie einen beschreibenden lokalisierten Grund

Die -Zeichenfolge wird in der Systemaufforderung angezeigt. Diese Zeichenfolge sollte prägnant und spezifisch für die Aktion sein, die der Benutzer gerade autorisiert. Zum Beispiel ist “Sign in your account” besser als eine vage “Authentication required.” Lokalisieren Sie diese Zeichenfolge auch für verschiedene Sprachen.

Respektieren Sie die Privatsphäre der Nutzer

Speichern Sie niemals biometrische Daten (Fingerabdruckvorlagen oder Gesichtskarten) selbst. Das System verwaltet diese Daten sicher in der Secure Enclave. Ihre App erhält nur ein boolesches Erfolgs-/Ausfallergebnis, nicht die eigentlichen biometrischen Daten. Versuchen Sie nicht, diese Trennung zu umgehen.

Test auf echten Geräten

Der Simulator verfügt über begrenzte biometrische Simulationsmöglichkeiten. Testen Sie Touch ID und Face ID immer auf tatsächlichen iPhones und iPads. Für Face ID müssen Sie auch die -Taste in Ihrem einfügen; andernfalls wird die App abstürzen, wenn Sie versuchen, Face ID auszuwerten.

Umgang mit dem App Lifecycle

Wenn Ihre App die biometrische Authentifizierung verwendet, um einen Hintergrundzustand zu sichern, sollten Sie eine erneute Authentifizierung in Betracht ziehen, wenn die App in den Vordergrund zurückkehrt. Sie können die beobachten und erneut zur Authentifizierung auffordern.

Kombinieren Sie mit Keychain für stärkere Sicherheit

Die biometrische Authentifizierung allein überprüft nur die Identität des Benutzers zum Zeitpunkt der Überprüfung. Für dauerhafte Sicherheit (z. B. Speicherung von API-Token) kombinieren Sie Biometrie mit dem Schlüsselbund. Verwenden Sie die -Klasse mit den - oder -Flags, um sicherzustellen, dass gespeicherte Geheimnisse nur nach erfolgreicher biometrischer oder Passcode-Authentifizierung zugänglich sind. Der Schlüsselbund fungiert dann als sicherer Tresor, der automatisch gesperrt wird, wenn das Gerät gesperrt ist.

Fallback nach Lockout

Wenn die Biometrie aufgrund zu vieler fehlgeschlagener Versuche gesperrt ist, müssen Sie auf den Gerätepasscode zurückgreifen. Der Systempasscode-Eintrag setzt die biometrische Sperrung automatisch zurück, so dass nach einem erfolgreichen Passcode-Eintrag zukünftige biometrische Versuche wieder funktionieren. Versuchen Sie nicht, dies zu umgehen, es ist eine Sicherheitsmerkmal zum Schutz vor Brute-Force-Angriffen.

Unterschiede zwischen Touch ID und Face ID

Obwohl das LocalAuthentication Framework die meisten Unterschiede abstrahiert, gibt es ein paar Nuancen, die Sie beachten sollten:

  • Face ID erfordert ein Gerät mit einer TrueDepth Kamera. Sie sollten nach dem Aufruf überprüfen, um festzustellen, welcher biometrische Typ verfügbar ist.
  • Face ID hat eine höhere Reiseempfindlichkeit. Der Benutzer muss sich das Gerät direkt ansehen.
  • Alternate appearance for Face ID: iOS 15.4 und höher erlaubt es Benutzern, ein alternatives Aussehen einzurichten (z.B. mit einer Brille oder einer Maske). Ihre App muss nichts Besonderes tun; das System verarbeitet es automatisch.
  • Maskenunterstützung mit Face ID: Aktuelle iOS-Versionen unterstützen die Entsperrung mit einer Maske mit der Apple Watch. Für die Authentifizierung auf App-Ebene erfordert die Standard-Gesichts-ID-Eingabeaufforderung möglicherweise weiterhin eine vollständige Gesichtserkennung, es sei denn, der Benutzer hat sich für die Maskenverwendung mit Apple Watch entschieden. Der Rückgriff Ihrer App auf den Passcode deckt dieses Szenario ab.

Fehler beim Umgang mit Deep Dive

Wir haben uns kurz mit häufigen Fehlern befasst, aber es lohnt sich, darauf einzugehen, wie man auf jeden einzelnen auf benutzerfreundliche Weise reagiert.

Error CodeUser Feedback
biometryNotAvailableShow an alert: “Face ID / Touch ID is not available on this device. Please use your passcode.” Then offer your custom passcode screen.
biometryNotEnrolledPresent an alert that directs the user to Settings > Face ID & Passcode (or Touch ID & Passcode). You can open Settings directly using UIApplication.openSettingsURLString.
biometryLockoutPrompt the user to authenticate using the device passcode. The system passcode entry will reset the lockout. If you use the .deviceOwnerAuthentication policy, the system automatically handles the passcode prompt. If you used .deviceOwnerAuthenticationWithBiometrics, you must fall back to your own passcode entry or invoke the .deviceOwnerAuthentication policy again to trigger the system passcode UI.
passcodeNotSetAlert the user that a device passcode is required. Direct them to Settings to set one. You cannot continue until the passcode is configured.
userCancelSimply dismiss or return to the previous screen. Do not show an error; the user intentionally cancelled.
userFallbackThe user chose the fallback option. Present your own passcode entry screen (or rely on the system passcode if you used the combined policy).

Leistung und Threading

Die -Methode ist asynchron und blockiert nicht den Hauptthread. Der Vervollständigungshandler kann jedoch in einem Hintergrundthread aufgerufen werden. Immer UI-Updates in die Hauptwarteschlange senden. Vermeiden Sie außerdem, für jeden Authentifizierungsversuch ein neues zu erstellen; verwenden Sie eine Instanz nach Möglichkeit wieder, aber seien Sie sich bewusst, dass der Kontext nach einem biometrischen Sperrvorgang oder einem Neustart des Geräts ungültig werden kann. Als Best Practice erstellen Sie für jede Sitzung einen neuen Kontext, um sicherzustellen, dass Sie den neuesten Status haben.

Prüfung der biometrischen Authentifizierung

Sie können die biometrische Authentifizierung im iOS-Simulator mit dem Hardware-Menü simulieren. Bei Touch ID können Sie „Touch ID“ und dann „Matching Touch“ oder „Non-matching Touch“ wählen. Bei Face ID können Sie mit dem Simulator ein Gesicht einschreiben und dann übereinstimmende oder nicht übereinstimmende Versuche durchführen. Einige Szenarien (wie Lockout) sind jedoch nicht vollständig simuliert. Daher ist ein echter Gerätetest unerlässlich.

Darüber hinaus können Sie die Testpläne von Xcode verwenden, um Unit-Tests um Ihren Authentifizierungsmanager herum zu schreiben, indem Sie die Klasse [FLT: 50] verspotten - vorausgesetzt, Sie entwerfen Ihren Code mit Abhängigkeitsinjektion.

Externe Ressourcen

Für die weitere Lektüre und amtliche Dokumentation, siehe:

Schlussfolgerung

Die Implementierung der biometrischen Authentifizierung mit dem LocalAuthentication-Framework ist ein einfacher Prozess, der die Sicherheitslage Ihrer iOS-App erheblich verbessert und gleichzeitig eine flüssige Benutzererfahrung beibehält. Durch die Überprüfung der Verfügbarkeit, die anmutige Handhabung von Fehlern und die Bereitstellung zuverlässiger Ausweichoptionen können Sie ein Authentifizierungssystem erstellen, das die Privatsphäre der Benutzer respektiert und die strengen Richtlinien von Apple erfüllt.

Denken Sie daran, dass die biometrische Authentifizierung nur ein Teil einer umfassenden Sicherheitsstrategie ist. Kombinieren Sie sie mit sicherer Speicherung über den Keychain, Netzwerksicherheit und ordnungsgemäßem Sitzungsmanagement, um Ihren Benutzern das höchste Maß an Schutz zu bieten. Mit dem Code und den Best Practices, die in diesem Artikel geteilt werden, sind Sie gut gerüstet, um Touch ID und Face ID in Ihr nächstes iOS-Projekt zu integrieren.