Jetons JWT en Go (Golang) : Guide complet avec la bibliothèque golang-jwt
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 les parties. En Go (Golang), la bibliothèque la plus populaire et activement maintenue pour travailler avec JWT est golang-jwt/jwt/v5. Dans cet article, nous allons détailler comment installer, configurer et utiliser cette bibliothèque pour créer des applications web sécurisées.
Installation de la bibliothèque golang-jwt
Pour commencer, ajoutez la bibliothèque à votre projet avec go get :
go get github.com/golang-jwt/jwt/v5Après l'installation, importez le package dans votre code :
import ( "github.com/golang-jwt/jwt/v5")Composants principaux de JWT
JWT se compose de trois parties séparées par des points : Header (en-tête), Payload (charge utile) et Signature (signature). La bibliothèque golang-jwt fournit des structures pratiques pour travailler avec chacune d'elles :
- Header — contient les métadonnées sur le type de jeton et l'algorithme de signature (par exemple, HS256, RS256).
- Payload — contient les claims (revendications), telles que l'identifiant utilisateur, le temps d'expiration, les rôles et d'autres données.
- Signature — créée à l'aide d'une clé secrète ou d'une paire de clés (privée/publique).
Création d'un jeton JWT d'accès (Access Token)
Examinons un exemple de création d'un jeton d'accès avec l'algorithme HS256 (chiffrement symétrique). Commençons par définir une structure avec des claims personnalisés :
type CustomClaims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}Créons maintenant une fonction pour générer le jeton :
func GenerateAccessToken(userID int, username string, secretKey []byte) (string, error) { claims := CustomClaims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)), IssuedAt: jwt.NewNumericDate(time.Now()), Subject: "access", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(secretKey)}Ici, nous définissons la durée de vie du jeton à 15 minutes, ce qui est une pratique standard pour un access token. Utilisez jwt.NewNumericDate() pour un formatage correct du temps.
Vérification et analyse du jeton
Pour vérifier l'authenticité du jeton, il est nécessaire d'extraire les claims et de vérifier la signature :
func ValidateToken(tokenString string, secretKey []byte) (*CustomClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { // Vérifions que l'algorithme de signature attendu est utilisé if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("méthode de signature inattendue : %v", token.Header["alg"]) } return secretKey, nil })
if err != nil { return nil, err }
if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil }
return nil, fmt.Errorf("jeton invalide")}Il est important de vérifier l'algorithme de signature dans la fonction de callback pour éviter les attaques liées à la substitution d'algorithme.
Création et renouvellement du Refresh Token
Pour améliorer la sécurité, on utilise souvent une paire de jetons : un access token à courte durée de vie et un refresh token à longue durée de vie. Le refresh token permet d'obtenir un nouvel access token sans avoir à ressaisir le login/mot de passe.
func GenerateRefreshToken(userID int, secretKey []byte) (string, error) { Aussi dans la bibliothèque
Générateur de QR codes en TypeScript : la bibliothèque qrcode et son utilisation
ndarray Rust : guide complet avec exemples et tutoriel
Travailler avec CSV en C# (.NET) : bibliothèques et exemples