Авторизация и аутентификация в Swift: полное руководство для iOS/macOS

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

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

Начать курс

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

В разработке под iOS и macOS безопасность пользовательских данных — приоритет номер один. Аутентификация (подтверждение личности) и авторизация (предоставление прав доступа) — базовые компоненты любого современного приложения. В этой статье мы разберем ключевые инструменты, библиотеки и фреймворки Swift для реализации входа через Apple ID, сторонние сервисы (Google, Facebook), а также локальное хранение токенов.

Статья ориентирована на разработчиков, знакомых с основами Swift и Xcode. Все примеры кода протестированы на Swift 5.9+ и совместимы с iOS 17+/macOS 14+.

1. AuthenticationServices: Apple Sign In

Нативная авторизация через Apple ID — обязательное требование App Store для приложений, использующих сторонние провайдеры (Google, Facebook). Фреймворк AuthenticationServices предоставляет простой API для реализации Sign in with Apple.

import AuthenticationServices
import SwiftUI

struct SignInWithAppleView: View {
    var body: some View {
        SignInWithAppleButton(
            onRequest: { request in
                request.requestedScopes = [.fullName, .email]
            },
            onCompletion: { result in
                switch result {
                case .success(let authResults):
                    // Получаем токен пользователя
                    guard let credential = authResults.credential as? ASAuthorizationAppleIDCredential,
                          let tokenData = credential.identityToken,
                          let token = String(data: tokenData, encoding: .utf8)
                    else { return }
                    print("Apple token: \(token)")
                case .failure(let error):
                    print("Error: \(error.localizedDescription)")
                }
            }
        )
        .signInWithAppleButtonStyle(.black)
        .frame(width: 280, height: 44)
    }
}

Важно: Apple возвращает fullName и email только при первом входе. Для последующих авторизаций используйте userID из credential.user.

2. Firebase Authentication: мультипровайдерная аутентификация

Firebase Auth — кроссплатформенное решение для авторизации через email, Google, Facebook, GitHub и другие провайдеры. Включает готовые UI-компоненты и интеграцию с Firestore.

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

// Package.swift или через Xcode: File > Add Packages
// URL: https://github.com/firebase/firebase-ios-sdk.git
// Выберите FirebaseAuth, FirebaseFirestore

Пример входа через email/пароль:

import FirebaseAuth

func signInWithEmail(email: String, password: String) {
    Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
        if let error = error {
            print("Auth error: \(error.localizedDescription)")
            return
        }
        guard let user = authResult?.user else { return }
        print("User signed in: \(user.uid)")
    }
}

func createUser(email: String, password: String) {
    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
        // Обработка регистрации
    }
}

Для Google Sign-In дополнительно используется GoogleSignIn SDK. Firebase автоматически управляет сессиями и обновлением токенов.

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

Хранение JWT-токенов или refresh-токенов в UserDefaults — грубая ошибка безопасности. Используйте Keychain (зашифрованное хранилище iOS/macOS).

Обёртка для Keychain:

import Security

class KeychainManager {
    static func save(key: String, data: Data) {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecValueData as String: data
        ]
        SecItemDelete(query as CFDictionary)
        SecItemAdd(query as CFDictionary, nil)
    }
    
    static func load(key: String) -> Data? {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecReturnData as String: true,
            kSecMatchLimit as String: kSecMatchLimitOne
        ]
        var item: CFTypeRef?
        SecItemCopyMatching(query as CFDictionary, &item)
        return item as? Data
    }
    
    static func delete(key: String) {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key
        ]
        SecItemDelete(query as CFDictionary)
    }
}

Применение: сохраняйте access-токен после успешной аутентификации и загружайте его при старте приложения.

4. OAuth2 и WebAuth: универсальный протокол

Для кастомных серверов используйте OAuth 2.0 через ASWebAuthenticationSession (iOS) или ASWebAuthenticationSession (macOS 10.15+). Это безопасный браузерный поток без до

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