Cliente OAuth para Go (Golang): guía completa de la biblioteca

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

Cliente OAuth para Go (Golang): integración de autenticación en tu aplicación

\n\n

Las aplicaciones web modernas rara vez prescinden de la autenticación de terceros. OAuth 2.0 es un protocolo estándar que permite a los usuarios iniciar sesión a través de cuentas de Google, GitHub, VK y otros servicios. En el ecosistema de Go (Golang), para trabajar con OAuth existe una potente biblioteca golang.org/x/oauth2 que proporciona clientes listos para usar y herramientas flexibles para configurar la autorización.

\n\n

En este artículo, analizaremos en detalle cómo instalar, configurar y usar el cliente OAuth para Go, además de proporcionar ejemplos funcionales para proveedores populares.

\n\n

¿Qué es OAuth 2.0 y para qué sirve?

\n\n

OAuth 2.0 es un protocolo de acceso delegado. En lugar de almacenar las contraseñas de los usuarios, tu aplicación obtiene un token temporal que permite el acceso a recursos específicos (por ejemplo, al perfil del usuario). Las principales ventajas son:

\n\n
    \n
  • Seguridad — las contraseñas no se transmiten ni se almacenan en tu aplicación.
  • \n
  • Comodidad — los usuarios inician sesión con un solo clic a través de servicios que ya conocen.
  • \n
  • Flexibilidad — se pueden solicitar solo los permisos necesarios (scope).
  • \n
\n\n

Instalación de la biblioteca OAuth para Go

\n\n

La biblioteca golang.org/x/oauth2 es una extensión oficial de Go. La instalación se realiza con el comando estándar:

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

También puede ser necesario instalar el paquete para trabajar con un proveedor específico (por ejemplo, google o facebook). Para la mayoría de los servicios, es necesario escribir un endpoint propio, pero la estructura básica es la misma.

\n\n

Configuración básica del cliente OAuth

\n\n

Para comenzar, es necesario registrar la aplicación en el proveedor (Google, GitHub, etc.) y obtener ClientID y ClientSecret. Luego se crea la configuración OAuth2:

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "golang.org/x/oauth2"\n)\n\nfunc main() {\n    // Configuración OAuth2 para Google\n    conf := &oauth2.Config{\n        ClientID:     "TU_CLIENT_ID",\n        ClientSecret: "TU_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    // Generación de URL para redirigir al usuario\n    url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)\n    fmt.Printf("Ve al enlace para autorizar: %v\\n", url)\n}\n
\n\n

Observa el parámetro state — es una cadena para protección contra ataques CSRF. En una aplicación real, debe generarse aleatoriamente y almacenarse en la sesión.

\n\n

Manejo del callback y obtención del token

\n\n

Después de que el usuario se autorice, el proveedor lo redirige a RedirectURL con el parámetro code. Este código se intercambia por un token de acceso. Ejemplo de un manejador 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, "Código no recibido", http.StatusBadRequest)\n        return\n    }\n\n    // Intercambio del código por un token\n    token, err := oauthConfig.Exchange(context.Background(), code)\n    if err != nil {\n        http.Error(w, "Error al intercambiar token: "+err.Error(), http.StatusInternalServerError)\n        return\n    }\n\n                    

Recommendations