Внедрение биометрической аутентификации в Ios с помощью локальной аутентификации
Введение в биометрическую аутентификацию на iOS
Биометрическая аутентификация стала краеугольным камнем современной мобильной безопасности, предлагая баланс между удобством и защитой. Для разработчиков iOS платформа LocalAuthentication предоставляет простой, но мощный API для интеграции Touch ID, Face ID и проверки пароля устройства в приложения. В этой статье рассматривается полный процесс реализации биометрической аутентификации с использованием LocalAuthentication, от начальной настройки до готовых к производству лучших практик, обеспечивающих соответствие вашего приложения самым высоким стандартам конфиденциальности и безопасности пользователей.
В конце этого руководства вы узнаете, как проверить биометрическую доступность, подсказать пользователям аутентификацию, изящно обрабатывать ошибки и предоставлять резервные механизмы — все это при соблюдении рекомендаций Apple по конфиденциальности пользователей и защите данных.
Понимание структуры локальной аутентификации
Платформа LocalAuthentication, представленная в iOS 8, обеспечивает унифицированный интерфейс для оценки личности пользователя с помощью биометрии или пароля устройства. Она абстрагирует основные аппаратные различия между Touch ID и Face ID, позволяя писать логику аутентификации, которая работает беспрепятственно на всех поддерживаемых устройствах iOS.
К числу ключевых компонентов рамок относятся:
- LAContext: Центральный объект, управляющий политиками аутентификации, локализованными строками причин и обратным поведением.
- LAPolicy: Предопределенные политики, определяющие метод аутентификации. Двумя наиболее распространенными являются (только биометрия) и (биометрия с резервным кодом пароля).
- LAError: Коды ошибок, которые сообщают вашему приложению, почему аутентификация не удалась — биометрия недоступна, пользователь отменен, пароль не установлен и другие.
Хотя фреймворк прост в использовании, правильная реализация требует тщательного внимания к пользовательскому опыту, обработке ошибок и безопасности.
Политика аутентификации объяснена
- — Если биометрия (Touch ID или Face ID) зарегистрирована и доступна, эта политика побуждает пользователя только к биометрической проверке. Если биометрия недоступна, оценка политики не дает результата, не предлагая запасной код пароля. Это подходит для операций с низким риском, где вы хотите получить опыт без трения и можете справиться с отсутствием биометрии изящно.
- — Эта политика сначала пытается биометрическую проверку. Если биометрия недоступна, пользователь не регистрируется, или пользователь отменяет биометрическую подсказку, ваше приложение может вернуться к паролю устройства. Это рекомендуемая политика для большинства сценариев аутентификации, потому что она гарантирует, что даже когда биометрия не является опцией, пользователь все еще может аутентифицировать с помощью своего пароля.
Важно отметить, что резервный код пароля появляется только после того, как пользователь отменяет биометрическую подсказку или если биометрия не удается, и пользователь нажимает «Введите пароль».
Пошаговая реализация
Внедрение биометрической аутентификации включает в себя пять четких шагов: импорт фреймворка, создание экземпляра , проверка того, можно ли оценить желаемую политику, выполнение оценки и обработка результата.
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.Обработка результата
Когда аутентификация удалась, вы можете уверенно разрешить доступ к защищенному контенту или действиям. Когда он не удаётся, вам нужно определить причину, проверив . Ошибка будет типа , который является перечислением, соответствующим . Общие случаи включают:
- .userCancel: Пользователь нажал «Отменить» на биометрическую подсказку. Вы можете просто отклонить поток входа или повторную запись.
- .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)"
}
}
}
Этот класс инкапсулирует логику аутентификации и возвращает чистый результат успеха / неудачи с удобным сообщением. Ваши контроллеры просмотра могут вызывать и реагировать соответствующим образом.
Лучшие практики и производственные соображения
Хотя приведенный выше код обеспечивает прочную основу, несколько дополнительных практик обеспечат надежную, безопасную и удобную для пользователя реализацию.
Всегда предоставляйте обратный пароль
Даже если вы используете политику , у вас должен быть готов собственный экран ввода пароля. Многие пользователи могут не иметь биометрических данных или могут предпочесть использовать пароля в определенных ситуациях. Руководство 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 Code | User Feedback |
|---|---|
biometryNotAvailable | Show an alert: “Face ID / Touch ID is not available on this device. Please use your passcode.” Then offer your custom passcode screen. |
biometryNotEnrolled | Present an alert that directs the user to Settings > Face ID & Passcode (or Touch ID & Passcode). You can open Settings directly using UIApplication.openSettingsURLString. |
biometryLockout | Prompt 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. |
passcodeNotSet | Alert the user that a device passcode is required. Direct them to Settings to set one. You cannot continue until the passcode is configured. |
userCancel | Simply dismiss or return to the previous screen. Do not show an error; the user intentionally cancelled. |
userFallback | The 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 для написания единичных тестов вокруг вашего менеджера аутентификации, высмеивая класс , при условии, что вы разрабатываете свой код с помощью инъекции зависимости.
Внешние ресурсы
Для дальнейшего чтения и официальной документации, обратитесь к следующему:
- Документация локальной аутентификации Apple
- LAContext Class Reference
- WWDC 2017 — Создание приложений с Face ID
- Кейчейн-сервисы и биометрический контроль доступа
Заключение
Внедрение биометрической аутентификации с помощью платформы LocalAuthentication - это простой процесс, который значительно улучшает положение безопасности вашего приложения iOS при сохранении гибкого пользовательского опыта.Проверяя доступность, изящно обрабатывая ошибки и предоставляя надежные варианты резервного копирования, вы можете создать систему аутентификации, которая уважает конфиденциальность пользователей и соответствует строгим рекомендациям Apple.
Помните, что биометрическая аутентификация - это всего лишь часть комплексной стратегии безопасности. Объедините ее с безопасным хранением через Keychain, сетевой безопасностью и надлежащим управлением сеансами, чтобы предложить своим пользователям самый высокий уровень защиты. С кодом и лучшими практиками, представленными в этой статье, вы хорошо оснащены для интеграции Touch ID и Face ID в ваш следующий проект iOS.