Jetons JWT en Go (Golang) : bibliothèque golang-jwt et exemples d'utilisation

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


Aprè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) {                    

Recommendations