Tokens JWT en Swift (iOS/macOS): Guía completa
\n\nJSON Web Token (JWT) es un estándar abierto (RFC 7519) para crear tokens de acceso basados en JSON. JWT se utiliza ampliamente para autenticación e intercambio de información entre el cliente y el servidor. En el ecosistema de Apple (iOS, macOS, watchOS, tvOS), el trabajo con JWT se vuelve crítico al desarrollar aplicaciones que interactúan con REST API, microservicios o cualquier sistema que requiera transferencia segura de datos.
\n\nEste artículo está dedicado a la biblioteca SwiftJWT, la solución más popular y activamente mantenida para trabajar con JWT en el lenguaje Swift. Veremos la instalación, operaciones básicas (creación, firma, verificación) y escenarios de uso avanzados.
\n\n¿Qué es SwiftJWT?
\n\nSwiftJWT es una biblioteca ligera y nativa para Swift que permite:
\n- \n
- Crear JWT con claims (afirmaciones) arbitrarios \n
- Firmar tokens utilizando los algoritmos: HS256, HS384, HS512 (simétricos) y RS256, RS384, RS512 (asimétricos, basados en RSA) \n
- Verificar la firma y la fecha de expiración del token \n
- Decodificar el payload sin verificar la firma (por ejemplo, para mostrar información en el cliente) \n
- Trabajar con datos personalizados y campos estándar (iss, sub, exp, iat, etc.) \n
La biblioteca está escrita completamente en Swift, no requiere dependencias externas (excepto Foundation y Security) y es compatible con Swift Package Manager (SPM), CocoaPods y Carthage.
\n\nInstalación a través de Swift Package Manager
\n\nAgregue el paquete a su proyecto a través de Xcode o directamente en Package.swift:
// Package.swift\ndependencies: [\n .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")\n],\ntargets: [\n .target(name: "YourTarget", dependencies: ["SwiftJWT"])\n]\n\n\nOperaciones básicas con JWT
\n\n1. Creación y firma de token (HS256)
\n\nEl caso más simple: creación de un token utilizando una clave simétrica:
\n\nimport SwiftJWT\n\n// 1. Definir la estructura Claims (afirmaciones)\nstruct MyClaims: Claims {\n let iss: String\n let sub: String\n let exp: Date\n let admin: Bool\n let customData: String\n}\n\n// 2. Crear una instancia de Claims\nlet claims = MyClaims(\n iss: "com.yourcompany.app",\n sub: "user123",\n exp: Date(timeIntervalSinceNow: 3600), // +1 hora\n admin: true,\n customData: "some_value"\n)\n\n// 3. Definir la clave (para HS256 — cualquier cadena)\nlet secretKey = "your-256-bit-secret".data(using: .utf8)!\n\n// 4. Crear el JWT\nvar jwt = JWT(claims: claims)\nlet signedJWT = try jwt.sign(using: .hs256(key: secretKey))\nprint("Token creado:\\n\\(signedJWT)")\n\n\n2. Verificación y decodificación del token
\n\n// Verificación con comprobación de firma y fecha de expiración\nlet receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."\n\ndo {\n // Verificar y decodificar\n let verifiedJWT = try JWT<MyClaims>.verify(token: receivedToken, using: .hs256(key: secretKey))\n print("Token válido. Claims: \\(verifiedJWT.claims)")\n \n // Verificar campos específicos\n if verifiedJWT.claims.admin {\n print("El usuario es administrador")\n }\n} catch {\n print("Error de verificación: \\(error)")\n // Posibles errores: expiredToken, invalidSignature, malformedToken\n}\n\n// Decodificación sin verificación (solo para lectura de datos)\nif let payload = try? JWTDecoder().decodePayload(from: receivedToken) {\n print("Payload (sin verificación): \\(payload)")\n}\n\n\n3. Trabajo con claves asimétricas (RS256)
\n\nPara entornos de producción se recomienda usar cifrado asimétrico (RSA). El servidor firma el token con una clave privada, y el cliente verifica con la clave pública:
\n\n// También en la biblioteca
Trabajo con Excel en Rust: bibliotecas y ejemplos de código
Uso de GraphQL en Swift: bibliotecas Apollo y Relay para iOS/macOS
Envío de correo electrónico en Go (Golang): bibliotecas y ejemplos de código
Trabajo con Markdown en Rust: bibliotecas y herramientas