Биометрическая аутентификация
Аутентифицируйте пользователей с помощью Face ID и Touch ID.
«Биометрическая аутентификация» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Биометрия с помощью LocalAuthentication
Распознавание лица и отпечатка пальца позволяет пользователям подтвердить свою личность без ввода пароля. Фреймворк LocalAuthentication предоставляет эту возможность через LAContext, который применяет политику аутентификации и сообщает, успешно ли пользователь её прошёл.
import LocalAuthentication
let context = LAContext()
// One LAContext object drives a single auth attemptСначала проверьте доступность
Всегда вызывайте canEvaluatePolicy перед отображением запроса. На устройстве может отсутствовать биометрическое оборудование, пользователь может ещё не настроить биометрию или она может быть заблокирована после слишком большого числа неудачных попыток. При сбое возвращаются логическое значение и ошибка с объяснением причины.
import LocalAuthentication
func canUseBiometrics() -> Bool {
let context = LAContext()
var error: NSError?
return context.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
error: &error)
}Две политики
.deviceOwnerAuthenticationWithBiometrics требует распознавания лица или отпечатка пальца без перехода к коду-паролю. .deviceOwnerAuthentication сначала пытается использовать биометрию, но при необходимости переходит к коду-паролю устройства. Выбирайте вариант в зависимости от того, допустимо ли использование кода-пароля.
import LocalAuthentication
// Biometrics only (no passcode fallback):
let strict = LAPolicy.deviceOwnerAuthenticationWithBiometrics
// Biometrics with passcode fallback:
let lenient = LAPolicy.deviceOwnerAuthentication
_ = (strict, lenient)Проверка политики
evaluatePolicy выполняет аутентификацию и показывает системное окно биометрической проверки. Строка localizedReason объясняет пользователю, зачем Вы запрашиваете доступ. Асинхронная форма возвращает логическое значение или завершается с ошибкой.
import LocalAuthentication
func authenticate() async -> Bool {
let context = LAContext()
do {
return try await context.evaluatePolicy(
.deviceOwnerAuthentication,
localizedReason:
String(localized: "Unlock your account"))
} catch {
return false
}
}Определение типа биометрии
После вызова canEvaluatePolicy свойство context.biometryType сообщает, какой тип биометрии использует устройство: .faceID, .touchID, .opticID или .none. Используйте его, чтобы показывать в собственном интерфейсе правильный значок и формулировку.
import LocalAuthentication
func biometryLabel() -> String {
let context = LAContext()
_ = context.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics, error: nil)
switch context.biometryType {
case .faceID: return "Face ID"
case .touchID: return "Touch ID"
case .opticID: return "Optic ID"
default: return "Passcode"
}
}Обработка ошибок
Сбои поступают в виде кодов LAError: .userCancel, .userFallback (пользователь выбрал код-пароль), .biometryLockout после слишком большого числа неудачных попыток и .biometryNotEnrolled. Обрабатывайте эти случаи отдельно, чтобы давать полезные рекомендации вместо общего сообщения об ошибке.
import LocalAuthentication
func describe(_ error: Error) -> String {
guard let la = error as? LAError else { return "failed" }
switch la.code {
case .userCancel: return "cancelled"
case .biometryLockout: return "locked out"
case .biometryNotEnrolled: return "not set up"
default: return "failed"
}
}Строка назначения для распознавания лица
Для использования распознавания лица необходимо добавить в Info.plist ключ NSFaceIDUsageDescription с объяснением причины. Если его не добавить, приложение завершится с ошибкой при первой проверке политики распознавания лица. Для распознавания отпечатка пальца такой ключ не нужен.
// Info.plist:
// NSFaceIDUsageDescription =
// "We use Face ID to unlock your saved passwords."
let required = "NSFaceIDUsageDescription is mandatory"
_ = requiredНастройка окна запроса
Запрос можно настроить: localizedCancelTitle переименовывает кнопку отмены, а localizedFallbackTitle задаёт или, если строка пуста, скрывает запасной вариант. Пустая строка запасного варианта убирает возможность ввода кода-пароля.
import LocalAuthentication
func configured() -> LAContext {
let context = LAContext()
context.localizedCancelTitle =
String(localized: "Not now")
context.localizedFallbackTitle = "" // hide fallback
return context
}Повторное использование успешной аутентификации
По умолчанию каждый вызов evaluatePolicy снова запрашивает аутентификацию. Значение touchIDAuthenticationAllowableReuseDuration позволяет недавней успешной разблокировке удовлетворить последующую проверку без нового запроса — это удобно для нескольких связанных чувствительных действий в течение небольшого промежутка времени.
import LocalAuthentication
func reusableContext() -> LAContext {
let context = LAContext()
context.touchIDAuthenticationAllowableReuseDuration = 30
return context
}Биометрия и защита в Связке ключей
LAContext проверяет личность пользователя, но сам по себе не защищает данные. Для настоящей безопасности сочетайте его с SecAccessControl Связки ключей, чтобы секрет оставался криптографически недоступным до успешной аутентификации, а не просто скрывался за проверенным логическим значением.
import LocalAuthentication
// A bare evaluatePolicy == true is bypassable if your
// logic is tampered with. Prefer SecAccessControl so
// the data is encrypted until auth succeeds.
let pairing = "combine LAContext with Keychain ACL"
_ = pairingПолный сценарий разблокировки
Объедините проверку доступности, сообщения с учётом типа биометрии, проверку политики и обработку ошибок в одну надёжную процедуру, которую сможет вызывать интерфейс приложения.
import LocalAuthentication
func unlock() async -> Bool {
let context = LAContext()
var err: NSError?
guard context.canEvaluatePolicy(
.deviceOwnerAuthentication, error: &err) else {
return false
}
return (try? await context.evaluatePolicy(
.deviceOwnerAuthentication,
localizedReason:
String(localized: "Access your vault"))) ?? false
}Быстрая проверка
Вспомните разницу между двумя основными политиками.
Итоги
Вы изучили биометрическую аутентификацию:
- Используйте
LAContextи вызывайтеcanEvaluatePolicyпередevaluatePolicy. .deviceOwnerAuthenticationWithBiometricsиспользует только биометрию;.deviceOwnerAuthenticationдобавляет переход к коду-паролю.- Читайте
biometryType, чтобы выбрать правильную формулировку; обрабатывайте кодыLAError, например.biometryLockout. - Добавляйте
NSFaceIDUsageDescriptionи сочетайте его сSecAccessControlСвязки ключей для настоящей защиты.
Часто задаваемые вопросы
Урок «Биометрическая аутентификация» бесплатный?
Да — полный текст урока «Биометрическая аутентификация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Биометрическая аутентификация»?
Аутентифицируйте пользователей с помощью Face ID и Touch ID. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Биометрическая аутентификация»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Хранение секретов в связке ключей
- Управление доступом к связке ключей
- Биометрическая аутентификация
- Защита данных и шифрование