Jetons JWT en Swift (iOS/macOS) : Guide complet
\n\nJSON Web Token (JWT) est un standard ouvert (RFC 7519) pour la création de jetons d'accès basés sur JSON. JWT est largement utilisé pour l'authentification et l'échange d'informations entre le client et le serveur. Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), le travail avec JWT devient crucial lors du développement d'applications interagissant avec des API REST, des microservices ou tout système nécessitant un transfert sécurisé de données.
\n\nCet article est consacré à la bibliothèque SwiftJWT – la solution la plus populaire et activement maintenue pour travailler avec JWT en langage Swift. Nous aborderons l'installation, les opérations de base (création, signature, vérification) et les scénarios d'utilisation avancés.
\n\nQu'est-ce que SwiftJWT ?
\n\nSwiftJWT est une bibliothèque légère et native pour Swift qui permet de :
\n- \n
- Créer des JWT avec des claims (revendications) arbitraires \n
- Signer des jetons en utilisant les algorithmes : HS256, HS384, HS512 (symétriques) et RS256, RS384, RS512 (asymétriques, basés sur RSA) \n
- Vérifier la signature et la date d'expiration du jeton \n
- Décoder le payload sans vérifier la signature (par exemple, pour afficher des informations côté client) \n
- Travailler avec des données personnalisées et des champs standards (iss, sub, exp, iat, etc.) \n
La bibliothèque est entièrement écrite en Swift, ne nécessite pas de dépendances externes (sauf Foundation et Security) et est compatible avec Swift Package Manager (SPM), CocoaPods et Carthage.
\n\nInstallation via Swift Package Manager
\n\nAjoutez le package à votre projet via Xcode ou directement dans 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\nOpérations de base avec JWT
\n\n1. Création et signature d'un jeton (HS256)
\n\nLe cas le plus simple – création d'un jeton avec une clé symétrique :
\n\nimport SwiftJWT\n\n// 1. Définir la structure Claims (revendications)\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. Créer une instance de Claims\nlet claims = MyClaims(\n iss: "com.yourcompany.app",\n sub: "user123",\n exp: Date(timeIntervalSinceNow: 3600), // +1 heure\n admin: true,\n customData: "some_value"\n)\n\n// 3. Définir la clé (pour HS256 – n'importe quelle chaîne)\nlet secretKey = "your-256-bit-secret".data(using: .utf8)!\n\n// 4. Créer le JWT\nvar jwt = JWT(claims: claims)\nlet signedJWT = try jwt.sign(using: .hs256(key: secretKey))\nprint("Jeton créé :\\n\\(signedJWT)")\n\n\n2. Vérification et décodage du jeton
\n\n// Vérification avec contrôle de la signature et de la date d'expiration\nlet receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."\n\ndo {\n // Vérifier et décoder\n let verifiedJWT = try JWT<MyClaims>.verify(token: receivedToken, using: .hs256(key: secretKey))\n print("Jeton valide. Claims : \\(verifiedJWT.claims)")\n \n // Vérifier des champs spécifiques\n if verifiedJWT.claims.admin {\n print("L'utilisateur est administrateur")\n }\n} catch {\n print("Erreur de vérification : \\(error)")\n // Erreurs possibles : expiredToken, invalidSignature, malformedToken\n}\n\n// Décodage sans vérification (lecture seule des données)\nif let payload = try? JWTDecoder().decodePayload(from: receivedToken) {\n print("Payload (sans vérification) : \\(payload)")\n}\n\n\n3. Travail avec des clés asymétriques (RS256)
\n\nPour les environnements de production, il est recommandé d'utiliser le chiffrement asymétrique (RSA). Le serveur signe le jeton avec une clé privée, et le client vérifie avec une clé publique :
\n\n// Aussi dans la bibliothèque
Migrations de bases de données en Rust : aperçu des outils Diesel, SeaORM et sqlx
Travailler avec CSV en Go (Golang) : guide complet sur encoding/csv
Surveillance des applications PHP : outils et pratiques pour le développeur