Jetons JWT en Go (Golang) : guide complet
\n\nLes JSON Web Tokens (JWT) sont un standard ouvert (RFC 7519) pour la création de jetons d'accès basés sur JSON. Les JWT sont largement utilisés pour l'authentification et l'échange d'informations entre le client et le serveur. En langage Go (Golang), le travail avec les jetons JWT est implémenté simplement et efficacement grâce à la bibliothèque golang-jwt/jwt.
Dans cet article, nous allons détailler la création, la signature, la vérification et l'utilisation des jetons JWT en Go. Ce contenu sera utile aussi bien aux débutants qu'aux développeurs expérimentés souhaitant intégrer une authentification sécurisée dans leurs projets Golang.
\n\nInstallation de la bibliothèque golang-jwt
\n\nPour travailler avec JWT en Go, on utilise le paquet github.com/golang-jwt/jwt/v5. Installez-le avec la commande :
go get github.com/golang-jwt/jwt/v5\n\nAprès l'installation, vous pouvez importer le paquet dans votre code :
\n\nimport (\n "github.com/golang-jwt/jwt/v5"\n)\n\nStructure d'un jeton JWT
\n\nUn jeton JWT se compose de trois parties séparées par des points :
\n\n- \n
- Header (en-tête) — contient le type de jeton (JWT) et l'algorithme de signature (par exemple, HS256 ou RS256). \n
- Payload (charge utile) — contient les données (claims), telles que l'identifiant utilisateur, le rôle, la date d'expiration, etc. \n
- Signature (signature) — créée à partir de l'en-tête et de la charge utile à l'aide d'une clé secrète ou d'une paire de clés RSA/ECDSA. \n
Création d'un jeton JWT en Go
\n\nConsidérons un exemple de création d'un jeton JWT avec l'algorithme HMAC-SHA256 (HS256). Pour cela, une clé secrète est nécessaire.
\n\npackage main\n\nimport (\n "fmt"\n "time"\n "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n // Clé secrète (doit être stockée dans un endroit sûr)\n secretKey := []byte("my_secret_key_12345")\n\n // Création des claims (revendications)\n claims := jwt.MapClaims{\n "user_id": 123,\n "role": "admin",\n "exp": time.Now().Add(time.Hour * 24).Unix(), // le jeton est valide 24 heures\n "iat": time.Now().Unix(),\n }\n\n // Création du jeton\n token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\n // Signature du jeton avec la clé secrète\n tokenString, err := token.SignedString(secretKey)\n if err != nil {\n fmt.Println("Erreur lors de la création du jeton :", err)\n return\n }\n\n fmt.Println("Jeton JWT créé :")\n fmt.Println(tokenString)\n}\n\nVérification et analyse d'un jeton JWT
\n\nPour vérifier l'authenticité du jeton, on utilise la même clé secrète. Il est important de vérifier la date d'expiration et la signature.
\n\npackage main\n\nimport (\n "fmt"\n "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n tokenString := "votre_jeton_ici"\n secretKey := []byte("my_secret_key_12345")\n\n // Analyse et vérification du jeton\n token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n // Vérification de l'algorithme de signature\n if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n return nil, fmt.Errorf("méthode de signature inattendue : %v", token.Header["alg"])\n }\n return secretKey, nil\n })\n\n if err != nil {\n fmt.Println("Erreur de vérification du jeton :", err)\n return\n }\n\n // Extraction des claims\n if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\n fmt.Println("Jeton valide !")\n fmt.Printf("ID utilisateur : %v\\n", claims["user_id"])\n fmt.Printf("Rôle : %v\\n", claims["role"])\n } else {\n fmt.Println("Jeton invalide")\n }\n}\n\nUtilisation de claims structurés
\n\nPour plus de commodité, vous pouvez définir votre propre structure de claims implémentant l'interface jwt.Claims :
type CustomClaims struct {\n UserID int `json:"user_id"`\n Role string `json:"role"`\n jwt.RegisteredCl Aussi dans la bibliothèque
Files d'attente de tâches en Go (Golang) : meilleures bibliothèques et outils
Kotest pour Kotlin : guide complet avec exemples
Travailler avec les archives ZIP en PHP : ZipArchive et bibliothèques de compression