Внедрение биометрической аутентификации в Ios с помощью локальной аутентификации

Введение в биометрическую аутентификацию на iOS

Биометрическая аутентификация стала краеугольным камнем современной мобильной безопасности, предлагая баланс между удобством и защитой. Для разработчиков iOS платформа LocalAuthentication предоставляет простой, но мощный API для интеграции Touch ID, Face ID и проверки пароля устройства в приложения. В этой статье рассматривается полный процесс реализации биометрической аутентификации с использованием LocalAuthentication, от начальной настройки до готовых к производству лучших практик, обеспечивающих соответствие вашего приложения самым высоким стандартам конфиденциальности и безопасности пользователей.

В конце этого руководства вы узнаете, как проверить биометрическую доступность, подсказать пользователям аутентификацию, изящно обрабатывать ошибки и предоставлять резервные механизмы — все это при соблюдении рекомендаций Apple по конфиденциальности пользователей и защите данных.

Понимание структуры локальной аутентификации

Платформа LocalAuthentication, представленная в iOS 8, обеспечивает унифицированный интерфейс для оценки личности пользователя с помощью биометрии или пароля устройства. Она абстрагирует основные аппаратные различия между Touch ID и Face ID, позволяя писать логику аутентификации, которая работает беспрепятственно на всех поддерживаемых устройствах iOS.

К числу ключевых компонентов рамок относятся:

Хотя фреймворк прост в использовании, правильная реализация требует тщательного внимания к пользовательскому опыту, обработке ошибок и безопасности.

Политика аутентификации объяснена

Важно отметить, что резервный код пароля появляется только после того, как пользователь отменяет биометрическую подсказку или если биометрия не удается, и пользователь нажимает «Введите пароль».

Пошаговая реализация

Внедрение биометрической аутентификации включает в себя пять четких шагов: импорт фреймворка, создание экземпляра , проверка того, можно ли оценить желаемую политику, выполнение оценки и обработка результата.

1. Импортировать рамки

Начните с импорта в любой файл Swift, где вы планируете использовать аутентификацию. Этот импорт дает вам доступ к , и всем типам ошибок.

import LocalAuthentication

2. Создать LAContext

— объект, который запрашивает состояние системы и выполняет оценку аутентификации. Вы можете дополнительно настроить такие свойства, как (сообщение, показанное пользователю) и (текст для кнопки резервного копирования). Например, вы можете изменить заголовок резервного копирования на «Использовать пароль» вместо «Ввести пароль по умолчанию».

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

3.Проверить биометрическую доступность

Прежде чем подсказать пользователю, следует проверить, можно ли оценить выбранную политику. Эта проверка необходима для того, чтобы избежать резкого сбоя, который может сбить с толку пользователя. Используйте метод , передавая политику, которую вы намерены использовать. Метод возвращает булево значение. Если он возвращает , параметр (показатель ) будет содержать детали о том, почему оценка невозможна.

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
}

Общие причины отказа включают: устройство не поддерживает биометрию, не регистрируются отпечатки пальцев или лицо, не устанавливается пароль устройства или приложение не имеет права на Face ID (см. лучшие практики).

4.Оценить политику

После того, как вы подтвердили, что политика может быть оценена, позвоните . Параметр — это строка, которая объясняет, почему вашему приложению нужна аутентификация. Эта строка должна быть четкой и удобной для пользователя, потому что она отображается в системе оперативно. Для Face ID причина всегда показана; для Touch ID она может отображаться в зависимости от конфигурации устройства.

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")")
 }
 }
}

Обратите внимание, что обработчик завершения не гарантирует работу на основном потоке. Всегда отправляйте обновления пользовательского интерфейса и последующую логику в основную очередь, как показано выше.

5.Обработка результата

Когда аутентификация удалась, вы можете уверенно разрешить доступ к защищенному контенту или действиям. Когда он не удаётся, вам нужно определить причину, проверив . Ошибка будет типа , который является перечислением, соответствующим . Общие случаи включают:

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)"
 }
 }
}

Этот класс инкапсулирует логику аутентификации и возвращает чистый результат успеха / неудачи с удобным сообщением. Ваши контроллеры просмотра могут вызывать и реагировать соответствующим образом.

Лучшие практики и производственные соображения

Хотя приведенный выше код обеспечивает прочную основу, несколько дополнительных практик обеспечат надежную, безопасную и удобную для пользователя реализацию.

Всегда предоставляйте обратный пароль

Даже если вы используете политику , у вас должен быть готов собственный экран ввода пароля. Многие пользователи могут не иметь биометрических данных или могут предпочесть использовать пароля в определенных ситуациях. Руководство Apple по человеческому интерфейсу рекомендует предложить четкую альтернативу биометрии.

Используйте описательную локализованную причину

Струна показана в системном запросе. Эта строка должна быть краткой и конкретной для действия, которое пользователь собирается авторизовать. Например, «Подписаться на свою учетную запись» лучше, чем расплывчатая «Необходимая аутентификация». Также локализуйте эту строку для разных языков.

Уважайте конфиденциальность пользователей

Никогда не храните биометрические данные (шаблоны отпечатков пальцев или карты лица) самостоятельно. Система надежно управляет этими данными на Secure Enclave. Ваше приложение получает только булев результат успеха/неудачи, а не фактические биометрические данные. Не пытайтесь обойти это разделение.

Тест на реальные устройства

Симулятор имеет ограниченные возможности биометрического моделирования. Всегда тестируйте Touch ID и Face ID на реальных iPhone и iPad. Для Face ID вы также должны включить ключ в ; в противном случае приложение будет падать при попытке оценить Face ID.

Обработка жизненного цикла App

Если ваше приложение использует биометрическую аутентификацию для обеспечения фонового состояния, рассмотрите возможность повторной аутентификации, когда приложение возвращается на передний план. Вы можете наблюдать и снова запросить аутентификацию. Однако избегайте слишком частого запроса аутентификации — общая схема требует повторной аутентификации только после периода тайм-аута.

Совместите с Keychain для более надежной безопасности

Только биометрическая аутентификация проверяет личность пользователя в момент проверки. Для постоянной безопасности (например, хранения токенов API) объединяйте биометрию с Keychain. Используйте класс с флагами или , чтобы гарантировать, что сохраненные секреты могут быть доступны только после успешной биометрической или парольной аутентификации.

Обсуждение Fallback After Lockout

Когда биометрия заблокирована из-за слишком большого количества неудачных попыток, вы должны вернуться к паролю устройства. Система ввода пароля автоматически сбрасывает биометрический локаут, поэтому после успешного ввода пароля будущие биометрические попытки снова будут работать. Не пытайтесь обойти это; это функция безопасности для защиты от атак грубой силы.

Различия между Touch ID и Face ID

Хотя структура LocalAuthentication абстрагирует большинство различий, есть несколько нюансов, которые следует иметь в виду:

  • Идентификатор лица требует устройства с камерой TrueDepth. Вы должны проверить после вызова , чтобы определить, какой биометрический тип доступен. Это позволяет соответствующим образом настраивать ваши метки пользовательского интерфейса и значки.
  • Идентификатор лица имеет более высокую чувствительность к путешествиям. Пользователь должен смотреть непосредственно на устройство. Убедитесь, что ваше приложение нуждается в Face ID.
  • Альтернативный внешний вид для Face ID: iOS 15.4 и позже позволяют пользователям настроить альтернативный внешний вид (например, с очками или маской). Вашему приложению не нужно делать ничего особенного; система обрабатывает его автоматически.
  • Поддержка масок с Face ID: Последние версии iOS поддерживают разблокировку с помощью маски с помощью Apple Watch. Для аутентификации на уровне приложений стандартная подсказка Face ID может по-прежнему требовать полного распознавания лиц, если пользователь не выбрал использование масок с Apple Watch.

Обработка ошибок Deep Dive

Мы кратко рассмотрели распространенные ошибки, но стоит проработать, как реагировать на каждую из них в удобной для пользователя форме.

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).

Производительность и Threading

Метод асинхронен и не блокирует основной поток. Однако обработчик завершения можно вызвать на фоновый поток. Всегда отправляйте обновления пользовательского интерфейса в основную очередь. Кроме того, избегайте создания нового для каждой попытки аутентификации; повторно используйте экземпляр, если это возможно, но имейте в виду, что контекст может стать недействительным после биометрического блокировки или перезапуска устройства. Как лучшая практика, создайте новый контекст для каждой сессии, чтобы убедиться, что у вас есть последнее состояние.

Тестирование биометрической аутентификации

Можно симулировать биометрическую аутентификацию в iOS Simulator с помощью меню Hardware. Для Touch ID можно выбрать «Touch ID», а затем «Matching Touch» или «Non-matching Touch». Для Face ID симулятор позволяет записать лицо и затем выполнить попытки сопоставления или несоответствия. Однако некоторые сценарии (например, локаут) не полностью симулируются. Поэтому тестирование реального устройства незаменимо.

Кроме того, вы можете использовать планы тестирования Xcode для написания единичных тестов вокруг вашего менеджера аутентификации, высмеивая класс , при условии, что вы разрабатываете свой код с помощью инъекции зависимости.

Внешние ресурсы

Для дальнейшего чтения и официальной документации, обратитесь к следующему:

Заключение

Внедрение биометрической аутентификации с помощью платформы LocalAuthentication - это простой процесс, который значительно улучшает положение безопасности вашего приложения iOS при сохранении гибкого пользовательского опыта.Проверяя доступность, изящно обрабатывая ошибки и предоставляя надежные варианты резервного копирования, вы можете создать систему аутентификации, которая уважает конфиденциальность пользователей и соответствует строгим рекомендациям Apple.

Помните, что биометрическая аутентификация - это всего лишь часть комплексной стратегии безопасности. Объедините ее с безопасным хранением через Keychain, сетевой безопасностью и надлежащим управлением сеансами, чтобы предложить своим пользователям самый высокий уровень защиты. С кодом и лучшими практиками, представленными в этой статье, вы хорошо оснащены для интеграции Touch ID и Face ID в ваш следующий проект iOS.