Client OAuth pour Go (Golang) : guide complet de la bibliothèque

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

Client OAuth pour Go (Golang) : intégration de l'authentification dans votre application

\n\n

Les applications web modernes se passent rarement d'une authentification tierce. OAuth 2.0 est le protocole standard qui permet aux utilisateurs de se connecter via les comptes Google, GitHub, VK et d'autres services. Dans l'écosystème Go (Golang), il existe une bibliothèque puissante golang.org/x/oauth2 pour travailler avec OAuth, qui fournit des clients prêts à l'emploi et des outils flexibles pour configurer l'autorisation.

\n\n

Dans cet article, nous allons détailler comment installer, configurer et utiliser le client OAuth pour Go, et fournir des exemples fonctionnels pour les fournisseurs populaires.

\n\n

Qu'est-ce qu'OAuth 2.0 et pourquoi en a-t-on besoin ?

\n\n

OAuth 2.0 est un protocole d'accès délégué. Au lieu de stocker les mots de passe des utilisateurs, votre application reçoit un jeton temporaire qui permet l'accès à certaines ressources (par exemple, au profil de l'utilisateur). Les principaux avantages :

\n\n
    \n
  • Sécurité — les mots de passe ne sont ni transmis ni stockés dans votre application.
  • \n
  • Commodité — les utilisateurs se connectent en un clic via des services qu'ils connaissent déjà.
  • \n
  • Flexibilité — vous pouvez demander uniquement les autorisations nécessaires (scope).
  • \n
\n\n

Installation de la bibliothèque OAuth pour Go

\n\n

La bibliothèque golang.org/x/oauth2 est une extension officielle de Go. L'installation se fait avec la commande standard :

\n\n
go get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google   // pour Google\ngo get golang.org/x/oauth2/github   // pour GitHub (si disponible)\n
\n\n

L'installation d'un package pour un fournisseur spécifique (par exemple, google ou facebook) peut également être nécessaire. Pour la plupart des services, vous devez écrire votre propre endpoint, mais la structure de base est la même.

\n\n

Configuration de base du client OAuth

\n\n

Pour commencer, vous devez enregistrer une application auprès du fournisseur (Google, GitHub, etc.) et obtenir un ClientID et un ClientSecret. Ensuite, créez une configuration OAuth2 :

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "golang.org/x/oauth2"\n)\n\nfunc main() {\n    // Configuration OAuth2 pour Google\n    conf := &oauth2.Config{\n        ClientID:     "VOTRE_CLIENT_ID",\n        ClientSecret: "VOTRE_CLIENT_SECRET",\n        RedirectURL:  "http://localhost:8080/callback",\n        Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n        Endpoint: oauth2.Endpoint{\n            AuthURL:  "https://accounts.google.com/o/oauth2/auth",\n            TokenURL: "https://oauth2.googleapis.com/token",\n        },\n    }\n\n    // Génération de l'URL pour rediriger l'utilisateur\n    url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)\n    fmt.Printf("Suivez le lien pour vous autoriser : %v\\n", url)\n}\n
\n\n

Notez le paramètre state — c'est une chaîne pour se protéger contre les attaques CSRF. Dans une application réelle, elle doit être générée aléatoirement et stockée dans la session.

\n\n

Traitement du callback et obtention du jeton

\n\n

Une fois que l'utilisateur s'est autorisé, le fournisseur le redirige vers RedirectURL avec le paramètre code. Ce code est échangé contre un jeton d'accès. Exemple de gestionnaire en Go :

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "net/http"\n    "golang.org/x/oauth2"\n)\n\nvar oauthConfig *oauth2.Config\n\nfunc callbackHandler(w http.ResponseWriter, r *http.Request) {\n    code := r.URL.Query().Get("code")\n    if code == "" {\n        http.Error(w, "Code non reçu", http.StatusBadRequest)\n        return\n    }\n\n    // Échange du code contre un jeton\n    token, err := oauthConfig.Exchange(context.Background(), code)\n    if err != nil {\n        http.Error(w, "Erreur d'échange du jeton : "+err.Error(), http.StatusInternalServerError)\n        return\n    }\n\n                    

Recommendations