Introduction : pourquoi OAuth 2.0 et JWT en Go ?
\nLes applications web et API modernes fonctionnent rarement sans système d'autorisation. Si vous développez en Go (Golang) et souhaitez sécuriser vos endpoints, vous devez comprendre deux technologies clés : OAuth 2.0 (protocole de délégation d'accès) et JWT (JSON Web Token — format de token compact).
\nDans cet article, nous allons voir comment implémenter une autorisation sécurisée en Go à partir de zéro. Vous apprendrez :
\n- \n
- En quoi OAuth 2.0 diffère de JWT et comment ils fonctionnent ensemble. \n
- Comment générer et vérifier des tokens JWT en Go. \n
- Comment construire une autorisation OAuth 2.0 minimale (flux Client Credentials). \n
- Comment sécuriser une API REST avec un middleware. \n
Cet article est destiné aux développeurs débutants qui connaissent déjà les bases de Go et des serveurs HTTP.
\n\nBases : OAuth 2.0 et JWT ne sont pas la même chose
\nBeaucoup de débutants confondent ces concepts. Mettons les choses au clair immédiatement.
\n\nQu'est-ce qu'OAuth 2.0 ?
\nOAuth 2.0 est un protocole d'autorisation qui permet à un service (client) d'obtenir un accès limité aux ressources d'un autre service (serveur) au nom d'un utilisateur. Imaginez que vous souhaitiez vous connecter à un site via Google. Le site ne reçoit pas votre mot de passe — il reçoit de Google un token temporaire qui donne accès uniquement à votre email (et avec votre consentement).
\nLes rôles principaux dans OAuth 2.0 :
\n- \n
- Resource Owner — le propriétaire des données (généralement l'utilisateur). \n
- Client — l'application qui souhaite obtenir l'accès. \n
- Authorization Server — le serveur qui délivre les tokens après vérification. \n
- Resource Server — le serveur qui stocke les données protégées et vérifie les tokens. \n
Qu'est-ce que JWT ?
\nJWT (JSON Web Token) est un format de token. Il se présente sous la forme d'une chaîne de trois parties séparées par des points : header.payload.signature. JWT peut contenir n'importe quelles données (par exemple, ID utilisateur, rôle, date d'expiration) et est signé avec une clé secrète pour éviter toute falsification.
OAuth 2.0 n'est pas lié à JWT — le token peut être n'importe quelle chaîne. Cependant, en pratique, JWT est le plus souvent utilisé car il est autonome : le serveur n'a pas besoin de stocker les sessions en base de données, toutes les informations peuvent être vérifiées à la volée.
\n\nImplémentation de JWT en Go : génération et vérification des tokens
\nCommençons par la pratique. Pour travailler avec JWT en Go, nous utiliserons la bibliothèque golang-jwt/jwt/v5. Installez-la :
go get github.com/golang-jwt/jwt/v5\n\nGénération d'un Access Token
\nCréons une fonction qui prend un ID utilisateur et retourne un token JWT signé avec une durée de vie d'une heure.
\npackage main\n\nimport (\n "time"\n "github.com/golang-jwt/jwt/v5"\n)\n\nvar jwtSecret = []byte("your-secret-key") // En production, stockez dans .env !\n\ntype Claims struct {\n UserID uint `json:"user_id"`\n jwt.RegisteredClaims\n}\n\nfunc GenerateAccessToken(userID uint) (string, error) {\n claims := Claims{\n UserID: userID,\n RegisteredClaims: jwt.RegisteredClaims{\n ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)),\n IssuedAt: jwt.NewNumericDate(time.Now()),\n Issuer: "my-app",\n },\n }\n token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n return token.SignedString(jwtSecret)\n}\n\nVérification et analyse de JWT
\nÉcrivons maintenant un middleware qui vérifiera le token depuis l'en-tête Authorization: Bearer <token>.
func ValidateToken(tokenString string) (*Claims, error) {\n token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {\n // Vérifions que la méthode de signature est correcte\n