Introduction : pourquoi OAuth 2.0 et JWT sont-ils nécessaires en Go ?
Le développement web moderne est impensable sans une authentification et une autorisation sécurisées. Si vous écrivez votre première API, microservice ou application web en Go (Golang), tôt ou tard vous serez confronté à la nécessité de protéger les données des utilisateurs. Deux standards — OAuth 2.0 et JWT (JSON Web Token) — sont devenus la référence dans ce domaine.
Dans cet article, nous allons voir comment fonctionnent OAuth 2.0 et JWT, et écrire une implémentation simple mais fonctionnelle en Go. Vous apprendrez à émettre des jetons d'accès, à les vérifier et à sécuriser vos points de terminaison. Cet article est destiné aux développeurs débutants familiers avec les bases de Go et de HTTP.
Qu'est-ce que OAuth 2.0 et JWT ? En termes simples
OAuth 2.0 — le protocole d'accès délégué
OAuth 2.0 n'est ni une bibliothèque ni une fonction, mais un protocole. Imaginez que vous souhaitiez vous connecter à un site via Google. OAuth 2.0 permet au site d'obtenir de Google un accès limité à vos données (par exemple, votre email) sans que vous ayez à lui transmettre votre mot de passe Google. C'est ce qu'on appelle "l'accès délégué".
Les rôles principaux dans OAuth 2.0 :
- Resource Owner — l'utilisateur (vous).
- Client — l'application qui souhaite obtenir l'accès (notre site).
- Authorization Server — le serveur qui délivre les jetons (Google).
- Resource Server — le serveur contenant les données de l'utilisateur (API Google).
JWT — le format du jeton
JWT (JSON Web Token) est un moyen compact et autonome de transmettre des informations entre les parties sous la forme d'un objet JSON. Il se compose de trois parties séparées par des points :
- Header — le type de jeton et l'algorithme de signature (par exemple, HS256).
- Payload — les données (claims) : ID utilisateur, rôle, date d'expiration.
- Signature — la signature qui garantit que le jeton n'a pas été modifié.
Le JWT est souvent utilisé comme Access Token dans OAuth 2.0. Le serveur signe le jeton avec une clé secrète, et le client l'envoie dans l'en-tête Authorization: Bearer <token>.
Pratique : implémentation de l'autorisation JWT en Go
Nous allons écrire un petit serveur HTTP en Go qui émettra des jetons JWT et les vérifiera sur des routes protégées. Pour travailler avec JWT, nous utiliserons la bibliothèque populaire github.com/golang-jwt/jwt/v5.
Étape 1 : Installation des dépendances et structure du projet
Créez un nouveau module et installez la bibliothèque :
go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/cryptoLa structure des fichiers sera simple :
main.go— point d'entrée et routes.auth.go— logique de création et de vérification des JWT.handlers.go— gestionnaires HTTP.
Étape 2 : Création d'un jeton JWT
Créons le fichier auth.go. Ici, nous définirons la clé secrète (dans un projet réel, stockez-la dans un fichier .env) et une fonction pour générer le jeton.
package main
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key-here")
type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}
func GenerateToken(userID int, username string) (string, error) { claims := Claims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "auth-example", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}\