Tokens JWT en Swift: Trabajo con JSON Web Token en iOS/macOS

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Tokens JWT en Swift (iOS/macOS): Guía completa

\n\n

JSON 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\n

Este 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\n

SwiftJWT 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
\n\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\n

Instalación a través de Swift Package Manager

\n\n

Agregue el paquete a su proyecto a través de Xcode o directamente en Package.swift:

\n\n
// 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\n

Operaciones básicas con JWT

\n\n

1. Creación y firma de token (HS256)

\n\n

El caso más simple: creación de un token utilizando una clave simétrica:

\n\n
import 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\n

2. 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\n

3. Trabajo con claves asimétricas (RS256)

\n\n

Para 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
//                    

Recommendations