Tokens JWT em Swift (iOS/macOS): Guia Completo
\n\nJSON Web Token (JWT) é um padrão aberto (RFC 7519) para criar tokens de acesso baseados em JSON. JWT é amplamente utilizado para autenticação e troca de informações entre cliente e servidor. No ecossistema Apple (iOS, macOS, watchOS, tvOS), trabalhar com JWT torna-se crítico ao desenvolver aplicativos que interagem com APIs REST, microsserviços ou qualquer sistema que exija transmissão segura de dados.
\n\nEste artigo é dedicado à biblioteca SwiftJWT — a solução mais popular e ativamente mantida para trabalhar com JWT na linguagem Swift. Abordaremos instalação, operações básicas (criação, assinatura, verificação) e cenários avançados de uso.
\n\nO que é SwiftJWT?
\n\nSwiftJWT é uma biblioteca leve e nativa para Swift que permite:
\n- \n
- Criar JWTs com claims (declarações) arbitrárias \n
- Assinar tokens usando algoritmos: HS256, HS384, HS512 (simétricos) e RS256, RS384, RS512 (assimétricos, baseados em RSA) \n
- Verificar a assinatura e a validade do token \n
- Decodificar o payload sem verificar a assinatura (por exemplo, para exibir informações no cliente) \n
- Trabalhar com dados personalizados e campos padrão (iss, sub, exp, iat, etc.) \n
A biblioteca é escrita inteiramente em Swift, não requer dependências externas (além de Foundation e Security) e é compatível com Swift Package Manager (SPM), CocoaPods e Carthage.
\n\nInstalação via Swift Package Manager
\n\nAdicione o pacote ao seu projeto via Xcode ou diretamente no 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\nOperações Básicas com JWT
\n\n1. Criação e Assinatura de Token (HS256)
\n\nO caso mais simples — criar um token usando uma chave simétrica:
\n\nimport SwiftJWT\n\n// 1. Definir a estrutura Claims (declarações)\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. Criar uma instância 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 a chave (para HS256 — qualquer string)\nlet secretKey = "your-256-bit-secret".data(using: .utf8)!\n\n// 4. Criar o JWT\nvar jwt = JWT(claims: claims)\nlet signedJWT = try jwt.sign(using: .hs256(key: secretKey))\nprint("Token criado:\\n\\(signedJWT)")\n\n\n2. Verificação e Decodificação de Token
\n\n// Verificação com checagem de assinatura e validade\nlet receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."\n\ndo {\n // Verificar e 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("O usuário é administrador")\n }\n} catch {\n print("Erro de verificação: \\(error)")\n // Erros possíveis: expiredToken, invalidSignature, malformedToken\n}\n\n// Decodificação sem verificação (apenas para leitura de dados)\nif let payload = try? JWTDecoder().decodePayload(from: receivedToken) {\n print("Payload (sem verificação): \\(payload)")\n}\n\n\n3. Trabalhando com Chaves Assimétricas (RS256)
\n\nPara ambientes de produção, recomenda-se o uso de criptografia assimétrica (RSA). O servidor assina o token com a chave privada, e o cliente verifica com a chave pública:
\n\n// Também na biblioteca
Trabalho com datas em Kotlin: bibliotecas e ferramentas para desenvolvimento
Actix-web para Rust: guia completo com exemplos
Biblioteca WebSocket Java: Tyrus — implementação JSR 356 para tempo real
Trabalho com datas em Kotlin: visão geral de bibliotecas e ferramentas