Jetons JWT en Swift : Travailler avec JSON Web Token sur iOS/macOS

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Jetons JWT en Swift (iOS/macOS) : Guide complet

\n\n

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

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

Qu'est-ce que SwiftJWT ?

\n\n

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

Installation via Swift Package Manager

\n\n

Ajoutez le package à votre projet via Xcode ou directement dans 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

Opérations de base avec JWT

\n\n

1. Création et signature d'un jeton (HS256)

\n\n

Le cas le plus simple – création d'un jeton avec une clé symétrique :

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

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

3. Travail avec des clés asymétriques (RS256)

\n\n

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

Recommendations