OAuth 2.0 et autorisation JWT en Go : guide pratique

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

OAuth 2.0 et autorisation JWT en Go : de la théorie à la pratique

\n\n

Les applications web et API modernes se passent rarement d'un système fiable d'authentification et d'autorisation. Deux standards — OAuth 2.0 et JWT (JSON Web Tokens) — sont devenus les standards de facto dans le monde du développement. Dans cet article, nous allons voir, à l'aide d'exemples pratiques, comment implémenter l'autorisation OAuth 2.0 avec JWT en langage Go (Golang).

\n\n

Nous allons créer un serveur REST API simple qui délivrera des jetons JWT après une authentification réussie via un fournisseur OAuth 2.0 (par exemple, Google) et les vérifiera à chaque requête.

\n\n

1. Bases de OAuth 2.0 et JWT

\n\n

Avant d'écrire du code, clarifions brièvement les termes.

\n\n
    \n
  • OAuth 2.0 — protocole d'autorisation qui permet aux utilisateurs d'accorder à des tiers un accès limité à leurs ressources sans transmettre leur identifiant et mot de passe. Rôles principaux : Resource Owner (utilisateur), Client (notre application), Authorization Server (serveur délivrant les jetons), Resource Server (serveur contenant les données protégées).
  • \n
  • JWT — format de jeton compact et sécurisé pour les URL, composé de trois parties : en-tête, charge utile et signature. Le JWT peut contenir toutes sortes de données (claims) et est signé avec une clé secrète ou une paire de clés RSA.
  • \n
\n\n

Dans notre implémentation, OAuth 2.0 sera utilisé pour obtenir un jeton d'identité du fournisseur (Google), puis nous générerons notre propre JWT pour les interactions ultérieures avec notre API.

\n\n

2. Configuration du projet et dépendances

\n\n

Créons un nouveau projet Go et installons les paquets nécessaires :

\n\n
mkdir go-oauth-jwt\ncd go-oauth-jwt\ngo mod init example.com/go-oauth-jwt\ngo get github.com/gin-gonic/gin\ngo get github.com/golang-jwt/jwt/v5\ngo get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google
\n\n

Nous utiliserons :

\n
    \n
  • Gin — framework HTTP rapide pour Go.
  • \n
  • golang-jwt — bibliothèque pour travailler avec JWT.
  • \n
  • oauth2 — bibliothèque standard Go pour OAuth 2.0.
  • \n
\n\n

Vous devrez également enregistrer une application dans Google Cloud Console, créer un identifiant client OAuth 2.0 et un secret, et spécifier l'URI de redirection (par exemple, http://localhost:8080/auth/google/callback).

\n\n

3. Implémentation de la connexion OAuth 2.0 via Google

\n\n

Commençons par créer la configuration OAuth 2.0 et les points de terminaison pour la connexion et le rappel.

\n\n
package main\n\nimport (\n    "crypto/rand"\n    "encoding/base64"\n    "net/http"\n    "os"\n\n    "github.com/gin-gonic/gin"\n    "golang.org/x/oauth2"\n    "golang.org/x/oauth2/google"\n)\n\nvar (\n    googleOauthConfig *oauth2.Config\n    oauthStateString  string\n)\n\nfunc init() {\n    googleOauthConfig = &oauth2.Config{\n        RedirectURL:  "http://localhost:8080/auth/google/callback",\n        ClientID:     os.Getenv("GOOGLE_CLIENT_ID"),\n        ClientSecret: os.Getenv("GOOGLE_CLIENT_SECRET"),\n        Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n        Endpoint:     google.Endpoint,\n    }\n    // Générer un jeton d'état aléatoire pour la protection CSRF\n    b := make([]byte, 32)\n    rand.Read(b)\n    oauthStateString = base64.StdEncoding.EncodeToString(b)\n}\n\nfunc main() {\n    r := gin.Default()\n\n    r.GET("/auth/google/login", handleGoogleLogin)\n    r.GET("/auth/google/callback", handleGoogleCallback)\n\n    r.Run(":8080")\n}\n\nfunc handleGoogleLogin(c *gin.Context) {\n    url := googleOauthConfig.AuthCodeURL(oauthStateString)\n    c.Redirect(http.StatusTemporaryRedirect, url)\n}\n\nfunc handleGoogleCallback(c *gin.Context) {\n    state := c.Query("state")\n    if state != oauthStateString {\n        c.JSON(http.StatusBadRequest, gin.H{"error": "invalid oauth state"})\n        return\n    }\n\n    code := c.Query("code")\n    token, err := googl                

Blogs

Book Recommendations