Jetons JWT en Go (Golang) : création et vérification avec exemples

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 Go (Golang) : guide complet

\n\n

Les 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.

\n\n

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

Installation de la bibliothèque golang-jwt

\n\n

Pour travailler avec JWT en Go, on utilise le paquet github.com/golang-jwt/jwt/v5. Installez-le avec la commande :

\n\n
go get github.com/golang-jwt/jwt/v5
\n\n

Après l'installation, vous pouvez importer le paquet dans votre code :

\n\n
import (\n    "github.com/golang-jwt/jwt/v5"\n)
\n\n

Structure d'un jeton JWT

\n\n

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

Création d'un jeton JWT en Go

\n\n

Considé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\n
package 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\n

Vérification et analyse d'un jeton JWT

\n\n

Pour 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\n
package 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\n

Utilisation de claims structurés

\n\n

Pour plus de commodité, vous pouvez définir votre propre structure de claims implémentant l'interface jwt.Claims :

\n\n
type CustomClaims struct {\n    UserID int    `json:"user_id"`\n    Role   string `json:"role"`\n    jwt.RegisteredCl                    

Recommendations