Autorización y autenticación en Go (Golang): guía completa

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

Autorización y autenticación en Go (Golang)



En el desarrollo web moderno con Go (Golang), la seguridad de los datos del usuario y el control de acceso son aspectos críticamente importantes. Las bibliotecas y herramientas para autorización y autenticación permiten a los desarrolladores implementar protección en sus aplicaciones de manera rápida y confiable. En este artículo, exploraremos los enfoques principales y las bibliotecas populares para implementar autenticación (verificación de identidad del usuario) y autorización (determinación de permisos de acceso) en Go.



Conceptos principales



Antes de pasar a las herramientas, es importante distinguir dos conceptos clave:

  • Autenticación — el proceso de verificar si un usuario es quien dice ser (generalmente mediante inicio de sesión/contraseña, tokens, OAuth).
  • Autorización — el proceso de determinar qué recursos y acciones están disponibles para un usuario autenticado (roles, permisos de acceso).


Bibliotecas y herramientas populares



1. bcrypt para hash de contraseñas

La biblioteca golang.org/x/crypto/bcrypt es el estándar de facto para el almacenamiento seguro de contraseñas. Agrega automáticamente sal y utiliza una función de hash adaptativa.



package main

import ( "fmt" "golang.org/x/crypto/bcrypt")

func main() { password := "mySecretPassword123" // Hash de la contraseña hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("Hash: %s", hash) // Verificación de la contraseña err = bcrypt.CompareHashAndPassword(hash, []byte("wrongPassword")) if err != nil { fmt.Println("Contraseña incorrecta:", err) } else { fmt.Println("Contraseña correcta") } // Verificación exitosa err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err == nil { fmt.Println("¡Contraseña correcta!") }}


2. JWT (JSON Web Tokens) con la biblioteca golang-jwt

La biblioteca github.com/golang-jwt/jwt/v5 permite crear y verificar tokens JWT. Es una forma popular de implementar autenticación sin estado (stateless).



package main

import ( "fmt" "time" "github.com/golang-jwt/jwt/v5")

var jwtSecret = []byte("super-secret-key")

func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(time.Hour * 24).Unix(), "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}

func validateToken(tokenString string) (string, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("método de firma inesperado: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims["user_id"].(string), nil } return "", fmt.Errorf("token no válido")}

func main() { // Creación del token token, _ := createToken("user123") fmt.Println("JWT Token:", token) // Verificación del token userID, err := validateToken(token) if err != nil { fmt.Println("Error de validación:", err) } else { fmt.Println("ID de usuario del token:", userID) }}


3. Autenticación basada en sesiones con gorilla/sessions

Para la autenticación tradicional basada en sesiones, use github.com/gorilla/sessions. Las sesiones se almacenan en el servidor y solo se envía al cliente una cookie con el ID de sesión.



package main

import ( "net/http" "github.com/gorilla/sessions")\

Recommendations