OAuth клиент для Swift (iOS/macOS): библиотека OAuthSwift

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

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

Начать курс

OAuth клиент для Swift (iOS/macOS): библиотека OAuthSwift

OAuthSwift — это мощная и гибкая библиотека для реализации протокола OAuth 1.0 и OAuth 2.0 в приложениях на Swift для iOS, macOS, watchOS и tvOS. Она предоставляет разработчикам простой и интуитивно понятный интерфейс для интеграции сторонних сервисов (Google, GitHub, Facebook, Twitter и других) без необходимости вручную обрабатывать сложные HTTP-запросы, редиректы и обмен токенами. Библиотека полностью написана на Swift, поддерживает современные версии языка (Swift 5+) и активно поддерживается сообществом.

Основное преимущество OAuthSwift — минимизация boilerplate-кода. Разработчику достаточно указать идентификатор клиента (client ID), секретный ключ (client secret), URL-адреса авторизации и перенаправления, а библиотека сама управляет процессом получения access-токена. OAuthSwift поддерживает все распространённые гранты OAuth 2.0: Authorization Code, Implicit, Client Credentials и Resource Owner Password Credentials. Для OAuth 1.0 реализована полная поддержка signature-методов HMAC-SHA1, RSA-SHA1 и Plaintext.

Установка и подключение

Библиотека распространяется через Swift Package Manager (SPM), CocoaPods и Carthage. Рекомендуемый способ — SPM:

// В Xcode: File → Swift Packages → Add Package Dependency
// URL: https://github.com/OAuthSwift/OAuthSwift.git
// Версия: от 2.2.0 и выше

Импорт в код:

import OAuthSwift

Базовая реализация OAuth 2.0 (на примере Google)

Рассмотрим полный пример авторизации через Google с использованием Authorization Code Flow. Предварительно необходимо создать проект в Google Cloud Console, получить client ID и настроить redirect URI (например, com.example.app:/oauth-callback).

class GoogleAuthManager {
    private var oauthSwift: OAuth2Swift?

    func startGoogleAuth() {
        oauthSwift = OAuth2Swift(
            consumerKey: "YOUR_CLIENT_ID",
            consumerSecret: "YOUR_CLIENT_SECRET",
            authorizeUrl: "https://accounts.google.com/o/oauth2/auth",
            accessTokenUrl: "https://oauth2.googleapis.com/token",
            responseType: "code"
        )

        // Настройка параметров запроса
        let state = generateState(withLength: 20)
        let scope = "https://www.googleapis.com/auth/userinfo.profile"

        // Запуск авторизации
        oauthSwift?.authorize(
            withCallbackURL: URL(string: "com.example.app:/oauth-callback")!,
            scope: scope,
            state: state,
            parameters: [:],
            headers: nil
        ) { result in
            switch result {
            case .success(let (credential, response, parameters)):
                print("Access Token: \(credential.oauthToken)")
                print("Refresh Token: \(credential.oauthRefreshToken)")
                self.fetchUserInfo(credential: credential)
            case .failure(let error):
                print("Ошибка авторизации: \(error.localizedDescription)")
            }
        }
    }

    private func fetchUserInfo(credential: OAuthSwiftCredential) {
        let url = "https://www.googleapis.com/oauth2/v2/userinfo"
        oauthSwift?.client.get(url, parameters: [:]) { result in
            switch result {
            case .success(let response):
                if let json = try? JSONSerialization.jsonObject(with: response.data) as? [String: Any] {
                    print("Email: \(json["email"] ?? "")")
                    print("Name: \(json["name"] ?? "")")
                }
            case .failure(let error):
                print("Ошибка получения данных: \(error)")
            }
        }
    }
}

Обработка URL-схемы (iOS)

Для корректной работы callback-URL необходимо настроить AppDelegate или SceneDelegate:

// AppDelegate.swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    if url.host == "oauth-callback" {
        OAuthSwift.handle(url: url)
    }
    return true
}

// Для iOS 13+ через SceneDelegate:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else { return }
    OAuthSwift.handle(url: url)
}

Работа с OAuth 1.0 (пример Twitter)

OAuthSwift поддерживает и устаревший протокол OAuth 1.0, который всё ещё используется некоторыми API:

let oauth1 = OAuth1Swift(
    consumerKey: "TWITTER_API_KEY",
    consumerSecret: "TWITTER_API_SECRET",
    requestTokenUrl: "https://api.twitter.com/oauth/request_token",
    authorizeUrl: "https://api.twitter.com/oauth/authorize",
    accessTokenUrl: "https://api.twitter.com/oauth/access_token"
)

oauth1.authorize(withCallbackURL: "myapp://oauth-callback/twitter") { result in
    switch result {
    case .success(let (credential, _, _)):
        print("Token: \(credential.oauthToken)")
        print("Secret: \(credential.oauthTokenSecret)")
    case .failure(let error):                    

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