Разработка
Реализуем Face ID аутентификацию в iOS-приложении
В этой статье мы рассмотрим процесс интеграции Face ID в приложения для iOS, чтобы повысить безопасность и удобство использования.
Введение
Биометрическая аутентификация изменила систему мобильной безопасности, и Face ID от Apple, представленный в iPhone X в 2017 году, стоит в авангарде этой революции.
Используя передовую технологию распознавания лиц, Face ID выходит за рамки традиционных методов, задействуя камеры с датчиком глубины и алгоритмы машинного обучения.
Храня данные в Secure Enclave, Face ID создает математическое представление черт лица, обеспечивая непревзойденную безопасность. Более того, его бесшовная интеграция в iOS-приложения изменила взаимодействие с пользователями, установив новые стандарты мобильной аутентификации.
В этой статье мы рассмотрим процесс интеграции Face ID в приложения для iOS, чтобы повысить безопасность и удобство использования.
Понимем Face ID
Face ID заменяет традиционный Touch ID сложной системой распознавания лиц, предоставляя пользователям безопасный и простой способ разблокировки устройств и подтверждения действий.
Используя систему камер TrueDepth, Face ID захватывает и анализирует черты лица в режиме реального времени, создавая точную 3D-карту. Эта карта, созданная из тысяч инфракрасных точек, проецируемых на лицо, формирует уникальный отпечаток лица и надежно хранится в Secure Enclave устройства.
Во время аутентификации Face ID сравнивает текущие данные лица с сохраненным отпечатком, используя машинное обучение для адаптации к изменениям внешности и обеспечения стабильной работы.
По сути, Face ID представляет собой удобное решение для аутентификации, в котором реализованы передовые технологии, позволяющие пересмотреть стандарты мобильной безопасности и пользовательского опыта на устройствах iOS.
1. Преимущества Face ID
Face ID — это значительный скачок в безопасности и удобстве по сравнению с традиционными методами аутентификации на основе паролей или PIN-кодов.
Используя технологию распознавания лиц, он устраняет необходимость ручного ввода, обеспечивая пользователям беспрепятственную аутентификацию без использования рук.
Кроме того, уникальность черт лица делает Face ID исключительно безопасным, значительно снижая риск фишинговых атак.
2. Устранение опасений
Ошибочные представления о безопасности и конфиденциальности Face ID вызвали опасения по поводу хранения данных и рисков конфиденциальности. Однако важно понимать, что Face ID надежно хранит данные лица локально на устройстве, делая их недоступными для приложений или облачных сервисов.
Кроме того, он постоянно совершенствует свою работу с помощью алгоритмов машинного обучения, повышая уровень безопасности и сохраняя конфиденциальность пользователя.
Поскольку Face ID работает исключительно на устройстве, он не передает данные лица извне, что снижает опасения по поводу конфиденциальности и обеспечивает защиту данных пользователя.
Требования и предварительные условия
Чтобы успешно интегрировать Face ID в приложения для iOS, разработчикам необходимо соответствовать определенным критериям.
1. Требования к аппаратному обеспечению
Убедитесь, что устройство оснащено системой камер TrueDepth (ключевой компонент для работы Face ID), доступной на iPhone X и более поздних моделях.
2. Требования к ОС
Для интеграции Face ID требуется минимальная версия iOS, совместимая с камерой TrueDepth, как правило, iOS 11 или более поздняя.
3. Требования к приложению
- Соображения конфиденциальности: Разработчики должны соблюдать правила конфиденциальности Apple и получать согласие пользователей при доступе к биометрическим данным для аутентификации.
- Возможности приложения: Убедитесь, что файл
Info.plist
приложения содержит необходимые разрешения и описания для доступа к FaceID. Это очень важно для информирования пользователей о том, почему приложение требует доступ к Face ID.
Этапы интеграции
Чтобы получить доступ к FaceID в приложении для iOS, необходимо выполнить несколько основных шагов:
Обновите Info.plist: Добавьте ‘Privacy — Face ID Usage Description’ в файл Info.plist приложения. Это строковое значение информирует пользователей об использовании Face ID в приложении и должно быть кратким, но информативным.
Примечание: опишите ключ как можно более кратко, но так, чтобы пользователь мог понять цель использования.
Создайте аутентификатор: Создайте аутентификатор в приложении, который использует Face ID API для аутентификации пользователей. Импортируйте модуль LocalAuthentication
, который предоставляет доступ к API, связанным с аутентификацией.
1. Проверка доступности
Здесь нам нужно проверить, поддерживает ли устройство биометрическую аутентификацию или нет, для этого мы создали расширение LAContext
, которое предоставляет статус доступности.
extension LAContext { enum BiometricType: String { case none case touchID case faceID case opticID // Added a case for potential future biometric methods } // Returns the detected biometric type based on the capabilities of the device var biometricType: BiometricType { var error: NSError? // Check if the device supports biometric authentication guard self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { return .none } if #available(iOS 11.0, *) { // Determine the specific biometric type supported on iOS 11.0 and later switch self.biometryType { case .none: return .none case .touchID: return .touchID case .faceID: return .faceID default: if #available(iOS 17.0, *) { // Support for potential future biometric methods if self.biometryType == .opticID { return .opticID } else { return .none } } } } // Fallback to checking for Touch ID support on iOS versions older than 11.0 return self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) ? .touchID : .none } }
Это расширение представляет перечисление BiometricType
, позволяющее разработчикам определять поддерживаемый метод биометрической аутентификации на устройствах iOS.
Оно проверяет, поддерживает ли устройство биометрическую аутентификацию, используя canEvaluatePolicy(_:error:)
. Если биометрическая аутентификация недоступна, возвращается значение .none
.
Для устройств под управлением iOS 11.0 и более поздних версий используется свойство biometryType
в LAContext
для определения поддерживаемого типа биометрии.
Кроме того, оно включает в себя случай для потенциальных будущих биометрических методов, таких как оптическое сканирование, и обеспечивает механизм отката для устройств, работающих под управлением iOS версии старше 11.0.
2. Реализация аутентификации
Для аутентификации мы создали класс Authenticator
, который управляет всем, что связано с аутентификацией.
В этом классе у нас есть метод authenticate()
, который определяет, прошел ли пользователь проверку подлинности или нет, и действует соответствующим образом.
private func authenticate() { // Check if biometric authentication is available and not locked guard isBiometricAvailable() && !isBiometricLocked else { return } isLoading = true var error: NSError? // Check if biometric authentication is possible if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) { // Perform biometric authentication let reason = "We need to unlock your data." // It presents a localized reason for authentication to the user, explaining why authentication is necessary. context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { [weak self] success, authenticationError in guard let self else { return } // Handle authentication completion if success { // proceeds to decrypt and verify the user's passcode let passcode = self.decryptUserPasscode() self.isAuthenticated = passcode != nil } else { // increments the failedAttempt count self.failedAttempt += 1 // check for the maximum allowed failed limit self.isBiometricLocked = self.failedAttempt >= self.maxFailedAttemptAllowed } self.isLoading = false } } else { // Handle error if biometric authentication is not possible if let error { handleLaError(error: error) } else { // Handle other errors if any } } }
Эта функция authenticate()
отвечает за инициирование процесса биометрической аутентификации.
- Она проверяет доступность и статус разблокировки биометрической аутентификации с помощью
canEvaluatePolicy
. Если это возможно, она приступает к выполнению и обрабатывает успех или неудачу соответственно. - Если все прошло успешно, то мы проверяем достижение предела неудач и если он достиг максимального предела, то, по сути, мы временно отключаем биометрическую аутентификацию.
- Если биометрическая аутентификация недоступна, проверяется наличие ошибки. Если ошибка присутствует, она обрабатывает ее соответствующим образом.
Эта функция обеспечивает структурированный подход к биометрической аутентификации, изящно обрабатывая сценарии успеха, неудачи и ошибки, обеспечивая плавное взаимодействие с пользователем.
- Если вы запрашиваете политику
deviceOwnerAuthenticationWithBiometrics
, то вам придется самостоятельно обрабатывать откат. - Если вы запросите только
deviceOwnerAuthentication
, то биометрия будет использоваться, если она доступна и разрешена, в противном случае она автоматически вернется к паролю, если биометрия недоступна, или предоставит вам возможность автоматического ввода, если попытка биометрии не удалась.
3. Безопасный пароль
func setPasscodeWith(_ code: String) { // Check if biometric authentication is available guard isBiometricAvailable() else { return } // Generate a unique encryption key let key = UUID().uuidString // Instead of this random string you can use a key that can be recoverable // Encrypt the passcode using AES encryption algorithm let encryptedPasscode = AESEncryptionManager.encrypt(plainText: code, key: key) // Store the encrypted passcode and encryption key securely userDefault.setValue(encryptedPasscode, forKey: userDefaultPasscodeKey) userDefault.setValue(key, forKey: userDefaultSecretKey) }
Эта Swift-функция setPasscodeWith(_:)
отвечает за установку пароля с использованием биометрической аутентификации, если она доступна.
Вот описание ее функциональности:
- Проверяет доступность биометрической аутентификации.
- Генерирует уникальный ключ шифрования с помощью
UUID().uuidString
, который будет использоваться для безопасного шифрования пароля. - Он шифрует предоставленный код с помощью сгенерированного ключа шифрования. Функция
AESEncryptionManager.encrypt(plainText:key:)
зашифровывает пароль с помощью алгоритма шифрования AES. - Она надежно сохраняет зашифрованный код и ключ шифрования в пользовательских настройках по умолчанию.
Зашифрованный код хранится в userDefaultPasscodeKey
, а ключ шифрования — в ключе userDefaultSecretKey
. Это гарантирует, что код будет сохранен на устройстве.
Если вы не знаете о AES-шифровании, то вот хорошая статья, в которой подробно рассказывается о шифровании.