OAuth 2.0 y autorización JWT en Go: guía completa para principiantes

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

Introducción: ¿por qué son necesarios OAuth 2.0 y JWT en Go?



El desarrollo web moderno es impensable sin autenticación y autorización seguras. Si estás escribiendo tu primera API, microservicio o aplicación web en Go (Golang), tarde o temprano te enfrentarás a la necesidad de proteger los datos de los usuarios. Dos estándares — OAuth 2.0 y JWT (JSON Web Token) — se han convertido en el estándar de oro en este ámbito.



En este artículo, analizaremos cómo funcionan OAuth 2.0 y JWT, y escribiremos una implementación simple pero funcional en Go. Aprenderás cómo emitir tokens de acceso, verificarlos y proteger tus endpoints. El artículo está dirigido a desarrolladores principiantes familiarizados con los fundamentos de Go y HTTP.



¿Qué son OAuth 2.0 y JWT? En palabras simples



OAuth 2.0 — protocolo de acceso delegado



OAuth 2.0 no es una biblioteca ni una función, sino un protocolo. Imagina que quieres iniciar sesión en un sitio web a través de Google. OAuth 2.0 permite que el sitio web obtenga de Google acceso limitado a tus datos (por ejemplo, el correo electrónico) sin que tengas que proporcionarle tu contraseña de Google. Esto se llama "acceso delegado".



Roles principales en OAuth 2.0:

  • Resource Owner — el usuario (tú).
  • Client — la aplicación que quiere obtener acceso (nuestro sitio web).
  • Authorization Server — el servidor que emite los tokens (Google).
  • Resource Server — el servidor con los datos del usuario (API de Google).


JWT — formato de token



JWT (JSON Web Token) es una forma compacta y autónoma de transmitir información entre partes como un objeto JSON. Consta de tres partes separadas por puntos:



  • Header — tipo de token y algoritmo de firma (por ejemplo, HS256).
  • Payload — datos (claims): ID de usuario, rol, fecha de expiración.
  • Signature — firma que garantiza que el token no ha sido modificado.


JWT se usa a menudo como Access Token en OAuth 2.0. El servidor firma el token con una clave secreta, y el cliente lo envía en el encabezado Authorization: Bearer <token>.



Práctica: implementación de autorización JWT en Go



Escribiremos un pequeño servidor HTTP en Go que emitirá tokens JWT y los verificará en rutas protegidas. Para trabajar con JWT usaremos la popular biblioteca github.com/golang-jwt/jwt/v5.



Paso 1: Instalación de dependencias y estructura del proyecto



Crea un nuevo módulo e instala la biblioteca:



go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/crypto


La estructura de archivos será simple:



  • main.go — punto de entrada y rutas.
  • auth.go — lógica de creación y verificación de JWT.
  • handlers.go — manejadores HTTP.


Paso 2: Creación del token JWT



Creemos el archivo auth.go. Aquí definiremos la clave secreta (en un proyecto real, guárdala en .env) y una función para generar el token.



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)}
\

Blogs

Book Recommendations