Cliente OAuth para Go (Golang): Conexión a proveedores OAuth 2.0

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca cliente OAuth para Go (Golang)



La biblioteca golang.org/x/oauth2 es el paquete oficial para trabajar con el protocolo OAuth 2.0 en el lenguaje Go. Proporciona una interfaz conveniente para la autenticación de usuarios a través de servicios de terceros (Google, GitHub, Facebook, VK y otros), así como para la gestión de tokens de acceso y actualización.



Esta herramienta es el estándar de facto para implementar OAuth 2.0 en aplicaciones Go. Es mantenida activamente por el equipo de Go y se utiliza en miles de proyectos, incluidos Kubernetes, Docker y muchos otros.



Características principales

  • Soporte para todos los grants de OAuth 2.0 — Authorization Code, Client Credentials, Resource Owner Password Credentials, Implicit.
  • Gestión automática de tokens — obtención, actualización y almacenamiento de tokens access/refresh.
  • Soporte integrado para proveedores populares — Google, GitHub, Facebook, Microsoft, Slack y otros.
  • Configuración flexible del cliente HTTP — inserción automática de tokens en los encabezados de las solicitudes.
  • Almacenamiento seguro de tokens — soporte para cifrado y almacenes personalizados.
  • Integración con net/http — middleware simple para el manejo de solicitudes.


Instalación

La instalación se realiza de forma estándar mediante go get:

go get golang.org/x/oauth2


También se recomienda instalar el paquete para un proveedor específico, por ejemplo, para Google:

go get golang.org/x/oauth2/google


Ejemplo básico de uso

Veamos un ejemplo simple de autenticación a través de Google OAuth 2.0:



package main

import ( "context" "fmt" "net/http" "golang.org/x/oauth2" "golang.org/x/oauth2/google")

func main() { // Configuración de OAuth 2.0 config := &oauth2.Config{ ClientID: "SU_CLIENT_ID", ClientSecret: "SU_CLIENT_SECRET", RedirectURL: "http://localhost:8080/callback", Scopes: []string{"https://www.googleapis.com/auth/userinfo.email"}, Endpoint: google.Endpoint, }

// Creamos la URL para la autorización authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) fmt.Println("Vaya al enlace:", authURL)

// Manejo del callback http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { code := r.URL.Query().Get("code") token, err := config.Exchange(context.Background(), code) if err != nil { http.Error(w, "Error al intercambiar el código", http.StatusInternalServerError) return } fmt.Fprintf(w, "Token de acceso: %s", token.AccessToken) })

http.ListenAndServe(":8080", nil)}


Trabajo con tokens

La biblioteca proporciona métodos convenientes para trabajar con tokens:



// Guardar el tokentoken := &oauth2.Token{    AccessToken:  "access-token",    TokenType:    "Bearer",    RefreshToken: "refresh-token",    Expiry:       time.Now().Add(1 * time.Hour),}

// Crear un cliente HTTP con inserción automática del tokenclient := config.Client(context.Background(), token)

// Realizar una solicitud con autorizaciónresp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")if err != nil { // manejo del error}defer resp.Body.Close()


Almacenamiento personalizado de tokens

Para aplicaciones en producción, se recomienda implementar un almacenamiento propio:



type TokenStorage interface {    GetToken() (*oauth2.Token, error)    SetToken(*oauth2.Token) error}

// Ejemplo usando un archivotype FileStorage struct { path string}

func (f *FileStorage) GetToken() (*oauth2.Token, error) { data, err := os.ReadFile(f.pat

Recommendations