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