OAuth 2.0 et autorisation JWT en Go : guide complet pour débutants

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

Introduction : pourquoi OAuth 2.0 et JWT en Go ?

\n

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

\n

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

Cet article est destiné aux développeurs débutants qui connaissent déjà les bases de Go et des serveurs HTTP.

\n\n

Bases : OAuth 2.0 et JWT ne sont pas la même chose

\n

Beaucoup de débutants confondent ces concepts. Mettons les choses au clair immédiatement.

\n\n

Qu'est-ce qu'OAuth 2.0 ?

\n

OAuth 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).

\n

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

Qu'est-ce que JWT ?

\n

JWT (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.

\n

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

Implémentation de JWT en Go : génération et vérification des tokens

\n

Commençons par la pratique. Pour travailler avec JWT en Go, nous utiliserons la bibliothèque golang-jwt/jwt/v5. Installez-la :

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

Génération d'un Access Token

\n

Créons une fonction qui prend un ID utilisateur et retourne un token JWT signé avec une durée de vie d'une heure.

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

Vérification et analyse de JWT

\n

Écrivons maintenant un middleware qui vérifiera le token depuis l'en-tête Authorization: Bearer <token>.

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

Blogs

Book Recommendations