Tokens JWT en Swift (iOS/macOS): guía completa
JSON Web Token (JWT) es una forma compacta y segura para URL de transferir datos entre partes en formato JSON. En el ecosistema de Apple (iOS, macOS, watchOS, tvOS), JWT se utiliza ampliamente para la autenticación de usuarios, el intercambio de información entre servicios y la implementación de Single Sign-On. En este artículo, analizaremos cómo trabajar con tokens JWT en Swift, qué bibliotecas usar y cómo implementar el ciclo completo: desde la creación hasta la verificación.
¿Qué es JWT y por qué es necesario en iOS/macOS?
JWT consta de tres partes separadas por puntos:
- Header — encabezado que contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256 o RS256).
- Payload — carga útil con datos (claims), como el identificador de usuario, fecha de expiración (exp), emisor (iss) y otros.
- Signature — firma creada a partir del header, payload y una clave secreta (o un par de claves para algoritmo asimétrico).
En aplicaciones móviles, JWT se usa generalmente para:
- Almacenar la sesión del usuario después del inicio de sesión.
- Transferir permisos de acceso entre el cliente y el servidor.
- Intercambiar datos de forma segura entre microservicios.
Bibliotecas populares para trabajar con JWT en Swift
Existen varias bibliotecas probadas que facilitan el trabajo con JWT en las plataformas de Apple:
- Swift-JWT (IBM) — una de las más populares, compatible con HS256, RS256, ES256 y otros algoritmos, funciona en iOS, macOS, Linux.
- JWTDecode (Auth0) — biblioteca ligera solo para decodificar y verificar la firma (sin crear tokens).
- Vapor JWT — para el lado del servidor en Swift (Vapor), pero también se puede usar en proyectos cliente.
- Kitura-CredentialsJWT — parte del ecosistema Kitura de IBM.
En este artículo nos centraremos en la biblioteca Swift-JWT, ya que es la más versátil y cuenta con soporte activo.
Instalación de Swift-JWT mediante Swift Package Manager (SPM)
Agregue la dependencia en el archivo Package.swift o a través de Xcode:
// Package.swiftdependencies: [ .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")],targets: [ .target(name: "YourTarget", dependencies: ["SwiftJWT"])]O en Xcode: File → Swift Packages → Add Package Dependency e indique la URL: https://github.com/Kitura/Swift-JWT.git.
Creación de un token JWT usando clave simétrica (HS256)
Veamos un ejemplo de creación de JWT con el algoritmo HS256 (clave simétrica):
import SwiftJWT
// Definimos la estructura para el payloadstruct MyClaims: Claims { let sub: String let exp: Date let iss: String let admin: Bool}
// Creamos la carga útillet claims = MyClaims( sub: "1234567890", exp: Date(timeIntervalSinceNow: 3600), // el token vive 1 hora iss: "pythonlib.ru", admin: true)
// Creamos el objeto JWTvar jwt = JWT(claims: claims)
// Especificamos el encabezado (opcional, por defecto HS256)let header = Header(kid: "my-key-id")jwt.header = header
// Clave secreta (en un proyecto real, guárdela en Keychain o .env)let privateKey = "my-secret-key".data(using: .utf8)!
// Firmamos y obtenemos la cadena del tokendo { let signedJWT = try jwt.sign(using: .hs256(key: privateKey)) print("JWT creado:\\(signedJWT)")} catch { print("Error de firma: \\(error)")}Verificación y decodificación de JWT
Para verificar la firma y extraer los datos del token, use:
let jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjg5OTk5OTk5LCJpc3MiOiJweXRob25saWIucnUiLCJhZG1