Introduction à OAuth 2.0 et JWT en Go
Les applications web modernes et les API nécessitent un système d'authentification et d'autorisation fiable et sécurisé. Les deux normes les plus populaires dans ce domaine sont OAuth 2.0 et JWT (JSON Web Tokens). En langage Go (Golang), l'implémentation de ces mécanismes devient particulièrement efficace grâce au support intégré de la concurrence, aux hautes performances et à un riche écosystème de bibliothèques.
Dans cet article, nous allons détailler comment implémenter l'autorisation OAuth 2.0 et JWT en Go. Vous apprendrez à configurer un serveur, générer et vérifier des tokens, ainsi qu'à protéger vos endpoints. Ce contenu sera utile aussi bien aux développeurs Go débutants qu'expérimentés.
Fondamentaux de OAuth 2.0 et JWT
Qu'est-ce que OAuth 2.0 ?
OAuth 2.0 est un protocole d'autorisation qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre son mot de passe. À la place, on utilise des tokens d'accès (access tokens). Les principaux acteurs du processus sont :
- Resource Owner — l'utilisateur propriétaire des données
- Client — l'application demandant l'accès
- Authorization Server — le serveur délivrant les tokens
- Resource Server — le serveur fournissant les ressources protégées
Qu'est-ce que JWT ?
JWT (JSON Web Token) est un format compact et autonome pour transmettre des données entre les parties sous la forme d'un objet JSON. Le token se compose de trois parties séparées par des points :
header.payload.signatureAvantages de JWT :
- Ne nécessite pas de stockage de sessions sur le serveur (stateless)
- Contient toutes les informations nécessaires (claims)
- Signé pour vérifier l'intégrité
Implémentation de l'autorisation JWT en Go
Pour travailler avec JWT en Go, nous utiliserons la bibliothèque populaire golang-jwt/jwt/v5. Installez-la avec la commande :
go get github.com/golang-jwt/jwt/v5Génération d'un token JWT
Créons une fonction pour générer des tokens d'accès et de rafraîchissement :
package auth
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key")
type Claims struct { UserID uint `json:"user_id"` Email string `json:"email"` jwt.RegisteredClaims}
func GenerateAccessToken(userID uint, email string) (string, error) { claims := &Claims{ UserID: userID, Email: email, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "myapp", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
func GenerateRefreshToken(userID uint) (string, error) { claims := &Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}Vérification d'un token JWT
Middleware pour vérifier le token dans les requêtes HTTP :
package middleware
import ( "net/http" "strings" "github.com/gin-gonic/gin" "myapp/auth")
func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"}) c.Abort() return }
tokenString := strings.TrimPrefix(authHeader, "Bearer ") if tokenString == authHeader {