Аутентификация и авторизация в Swift: LocalAuthentication, Firebase Auth, Keychain

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Аутентификация и авторизация в Swift (iOS/macOS): обзор инструментов и библиотек

В современной iOS/macOS-разработке безопасность и управление доступом — критически важные аспекты. Swift предоставляет как встроенные фреймворки для локальной аутентификации, так и интеграцию с облачными сервисами. В этой статье мы разберём основные инструменты и библиотеки для реализации входа, регистрации и проверки прав пользователя.

1. LocalAuthentication — Face ID / Touch ID / Apple Watch

Фреймворк LocalAuthentication позволяет аутентифицировать пользователя по биометрии или паролю устройства. Работает на iOS и macOS.

Основные возможности:

  • Проверка доступности биометрии (Face ID, Touch ID)
  • Аутентификация с контекстом (LAContext)
  • Использование кода устройства как запасного варианта

Пример кода:

import LocalAuthentication

func authenticateUser(completion: @escaping (Bool, Error?) -> Void) {
    let context = LAContext()
    var error: NSError?

    // Проверяем, доступна ли биометрия
    guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
        completion(false, error)
        return
    }

    // Запускаем аутентификацию
    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
                           localizedReason: "Подтвердите личность для доступа к данным") { success, authError in
        DispatchQueue.main.async {
            completion(success, authError)
        }
    }
}

2. Firebase Authentication — облачная аутентификация

Firebase Auth — мощная библиотека, поддерживающая вход через email/пароль, Google, Apple, GitHub и другие провайдеры. Идеально подходит для серверных приложений.

Установка через Swift Package Manager:

// В Package.swift добавьте:
// .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.0.0")
// target: "YourAppTarget", dependencies: ["FirebaseAuth"]

Регистрация нового пользователя:

import FirebaseAuth

func signUp(email: String, password: String) {
    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
        if let error = error {
            print("Ошибка регистрации: \(error.localizedDescription)")
            return
        }
        print("Пользователь зарегистрирован: \(authResult?.user.uid ?? "")")
    }
}

Вход существующего пользователя:

func signIn(email: String, password: String) {
    Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
        if let error = error {
            print("Ошибка входа: \(error.localizedDescription)")
            return
        }
        print("Вход выполнен: \(authResult?.user.email ?? "")")
    }
}

3. Keychain Services — безопасное хранение токенов

Для сохранения JWT-токенов, паролей или ключей используйте Keychain. Это нативный механизм iOS/macOS.

Пример сохранения и чтения:

import Security

func saveToKeychain(key: String, data: Data) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecValueData as String: data
    ]
    SecItemDelete(query as CFDictionary)
    let status = SecItemAdd(query as CFDictionary, nil)
    return status == errSecSuccess
}

func readFromKeychain(key: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    return status == errSecSuccess ? result as? Data : nil
}

4. JWT (JSON Web Tokens) — проверка и декодирование

Для работы с JWT в Swift часто используют библиотеку JWTDecode от Auth0. Она позволяет декодировать и проверять токены.

Установка через CocoaPods:

pod 'JWTDecode'

Пример декодирования:

import JWTDecode

func decodeJWT(token: String) {
    do {
        let jwt = try decode(jwt: token)
        print("Истекает: \(jwt.expiresAt)")
        print("Пользователь: \(jwt.subject)")
        // Проверка ролей
        if let roles = jwt["roles"] as? [String] {
            print("Роли: \(roles)")
        }
    } catch {
        print("Ошибка декодирования JWT: \(error)")
    }
}

5. SwiftUI + Combine — современный подход

В Swift

Рекомендаций