Tokens JWT em Swift (iOS/macOS): guia completo
JSON Web Token (JWT) é uma forma compacta e segura para URL de transmitir dados entre partes no formato JSON. No ecossistema Apple (iOS, macOS, watchOS, tvOS), o JWT é amplamente utilizado para autenticação de usuários, troca de informações entre serviços e implementação de Single Sign-On. Neste artigo, vamos abordar como trabalhar com tokens JWT em Swift, quais bibliotecas usar e como implementar o ciclo completo: desde a criação até a verificação.
O que é JWT e por que ele é necessário no iOS/macOS?
O JWT consiste em três partes, separadas por pontos:
- Header — cabeçalho contendo o tipo do token e o algoritmo de assinatura (por exemplo, HS256 ou RS256).
- Payload — carga útil com dados (claims), como identificador do usuário, data de expiração (exp), emissor (iss) e outros.
- Signature — assinatura criada com base no header, payload e chave secreta (ou par de chaves para algoritmo assimétrico).
Em aplicativos móveis, o JWT é geralmente usado para:
- Armazenar a sessão do usuário após o login.
- Transmitir direitos de acesso entre o cliente e o servidor.
- Troca segura de dados entre microsserviços.
Bibliotecas populares para trabalhar com JWT em Swift
Existem várias bibliotecas testadas que facilitam o trabalho com JWT nas plataformas Apple:
- Swift-JWT (IBM) — uma das mais populares, suporta HS256, RS256, ES256 e outros algoritmos, funciona no iOS, macOS, Linux.
- JWTDecode (Auth0) — biblioteca leve apenas para decodificação e verificação de assinatura (sem criação de tokens).
- Vapor JWT — para o lado do servidor em Swift (Vapor), mas também pode ser usado em projetos cliente.
- Kitura-CredentialsJWT — parte do ecossistema Kitura da IBM.
Neste artigo, vamos focar na biblioteca Swift-JWT, pois é a mais versátil e ativamente mantida.
Instalação do Swift-JWT via Swift Package Manager (SPM)
Adicione a dependência no arquivo Package.swift ou via Xcode:
// Package.swiftdependencies: [ .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")],targets: [ .target(name: "YourTarget", dependencies: ["SwiftJWT"])]Ou no Xcode: File → Swift Packages → Add Package Dependency e informe a URL: https://github.com/Kitura/Swift-JWT.git.
Criação de um token JWT usando chave simétrica (HS256)
Veja um exemplo de criação de JWT com o algoritmo HS256 (chave simétrica):
import SwiftJWT
// Define a estrutura para o payloadstruct MyClaims: Claims { let sub: String let exp: Date let iss: String let admin: Bool}
// Cria a carga útillet claims = MyClaims( sub: "1234567890", exp: Date(timeIntervalSinceNow: 3600), // token válido por 1 hora iss: "pythonlib.ru", admin: true)
// Cria o objeto JWTvar jwt = JWT(claims: claims)
// Define o cabeçalho (opcional, padrão é HS256)let header = Header(kid: "my-key-id")jwt.header = header
// Chave secreta (em um projeto real, armazene no Keychain ou .env)let privateKey = "my-secret-key".data(using: .utf8)!
// Assina e obtém a string do tokendo { let signedJWT = try jwt.sign(using: .hs256(key: privateKey)) print("JWT criado:\\(signedJWT)")} catch { print("Erro na assinatura: \\(error)")}Verificação e decodificação de JWT
Para verificar a assinatura e extrair os dados do token, use:
let jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjg5OTk5OTk5LCJpc3MiOiJweXRob25saWIucnUiLCJhZG1