JWT токены в Swift: полное руководство по работе с JSON Web Tokens

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

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

Начать курс

JWT токены в Swift (iOS/macOS): полное руководство

JSON Web Token (JWT) — это компактный, URL-безопасный способ передачи данных между сторонами в формате JSON. В экосистеме Apple (iOS, macOS, watchOS, tvOS) JWT широко используется для аутентификации пользователей, обмена информацией между сервисами и реализации Single Sign-On. В этой статье мы разберём, как работать с JWT токенами в Swift, какие библиотеки использовать и как реализовать полный цикл: от создания до верификации.

Что такое JWT и зачем он нужен в iOS/macOS?

JWT состоит из трёх частей, разделённых точками:

  • Header — заголовок, содержащий тип токена и алгоритм подписи (например, HS256 или RS256).
  • Payload — полезная нагрузка с данными (claims), такими как идентификатор пользователя, срок действия (exp), issuer (iss) и другие.
  • Signature — подпись, созданная на основе header, payload и секретного ключа (или пары ключей для асимметричного алгоритма).

В мобильных приложениях JWT обычно используется для:

  • Хранения сессии пользователя после логина.
  • Передачи прав доступа между клиентом и сервером.
  • Безопасного обмена данными между микросервисами.

Популярные библиотеки для работы с JWT в Swift

Существует несколько проверенных библиотек, которые упрощают работу с JWT на платформах Apple:

  • Swift-JWT (IBM) — одна из самых популярных, поддерживает HS256, RS256, ES256 и другие алгоритмы, работает на iOS, macOS, Linux.
  • JWTDecode (Auth0) — лёгкая библиотека только для декодирования и проверки подписи (без создания токенов).
  • Vapor JWT — для серверной стороны на Swift (Vapor), но может использоваться и в клиентских проектах.
  • Kitura-CredentialsJWT — часть экосистемы Kitura от IBM.

В этой статье мы сосредоточимся на библиотеке Swift-JWT, так как она наиболее универсальна и активно поддерживается.

Установка Swift-JWT через Swift Package Manager (SPM)

Добавьте зависимость в файл Package.swift или через Xcode:

// Package.swift
dependencies: [
    .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")
],
targets: [
    .target(name: "YourTarget", dependencies: ["SwiftJWT"])
]

Либо в Xcode: File → Swift Packages → Add Package Dependency и укажите URL: https://github.com/Kitura/Swift-JWT.git.

Создание JWT токена с использованием симметричного ключа (HS256)

Рассмотрим пример создания JWT с алгоритмом HS256 (симметричный ключ):

import SwiftJWT

// Определяем структуру для payload
struct MyClaims: Claims {
    let sub: String
    let exp: Date
    let iss: String
    let admin: Bool
}

// Создаём полезную нагрузку
let claims = MyClaims(
    sub: "1234567890",
    exp: Date(timeIntervalSinceNow: 3600), // токен живёт 1 час
    iss: "pythonlib.ru",
    admin: true
)

// Создаём JWT объект
var jwt = JWT(claims: claims)

// Указываем заголовок (опционально, по умолчанию HS256)
let header = Header(kid: "my-key-id")
jwt.header = header

// Секретный ключ (в реальном проекте храните его в Keychain или .env)
let privateKey = "my-secret-key".data(using: .utf8)!

// Подписываем и получаем строку токена
do {
    let signedJWT = try jwt.sign(using: .hs256(key: privateKey))
    print("Созданный JWT:\n\(signedJWT)")
} catch {
    print("Ошибка подписи: \(error)")
}

Верификация и декодирование JWT

Чтобы проверить подпись и извлечь данные из токена, используйте:

let jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjg5OTk5OTk5LCJpc3MiOiJweXRob25saWIucnUiLCJhZG1pbiI6dHJ1ZX0.xxxxxxxx"

// Тот же секретный ключ, что использовался при создании
let privateKey = "my-secret-key".data(using: .utf8)!

do {
    // Верифицируем и декодируем
    let jwt = try JWT<MyClaims>(jwtString: jwtString, verifier: .hs256(key: privateKey))
    print("Payload                    

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