token

package
v0.0.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 18, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Constants

View Source
const (
	TokenTypeAccess  = "access"
	TokenTypeRefresh = "refresh"
)

Variables

View Source
var (
	ErrJWTInvalid              = errors.New("token JWT inválido")
	ErrJWTExpired              = errors.New("token JWT expirado")
	ErrJWTSigningMethodInvalid = errors.New("método de firma JWT inválido")
)
View Source
var (
	// ErrSessionNotFound se retorna cuando no se encuentra la sesión solicitada.
	// Es un error genérico que no revela si la sesión existió o fue revocada.
	ErrSessionNotFound = errors.New("sesión no encontrada")

	// ErrSessionStoreFailed se retorna cuando el almacenamiento de sesiones
	// no puede completar la operación (fallo de BD, Redis, etc.).
	ErrSessionStoreFailed = errors.New("fallo en el almacenamiento de sesiones")
)

Functions

func CreateQuickSession

func CreateQuickSession(info SessionInfo) (string, error)

CreateQuickSession crea una sesión rápida usando el manager global.

func ExtractUserID

func ExtractUserID(tokenString string) string

func GenerateAccessToken

func GenerateAccessToken(claims Claims) (string, error)

func GenerateQuickToken

func GenerateQuickToken(userID, role string) (string, error)

func GenerateQuickTokenWithEmail

func GenerateQuickTokenWithEmail(userID, email, role string) (string, error)

func GenerateRefreshToken

func GenerateRefreshToken(claims Claims) (string, error)

func GetSessionUserID

func GetSessionUserID(sessionID string) string

GetSessionUserID extrae el UserID de una sesión válida. Retorna string vacío si la sesión es inválida.

func Init

func Init(config JWTConfig) error

func InitSession

func InitSession(config SessionConfig) error

InitSession permite reconfigurar el manager global de sesiones.

Ejemplo:

token.InitSession(token.SessionConfig{
    SecurityLevel:         security.LevelHigh,
    MaxConcurrentSessions: 3,
})

func QuickSessionExists

func QuickSessionExists(sessionID string) bool

QuickSessionExists verifica si una sesión existe y está activa. Retorna true si la sesión es válida, false en caso contrario.

func RefreshAccessToken

func RefreshAccessToken(refreshTokenString string) (string, error)

func RevokeAllQuickSessions

func RevokeAllQuickSessions(userID, reason string) error

RevokeAllQuickSessions revoca todas las sesiones de un usuario.

func RevokeQuickSession

func RevokeQuickSession(sessionID, reason string) error

RevokeQuickSession revoca una sesión usando el manager global.

func ValidateQuickToken

func ValidateQuickToken(tokenString string) bool

Types

type Claims

type Claims struct {
	jwt.RegisteredClaims

	UserID     string                 `json:"user_id"`
	Username   string                 `json:"username,omitempty"`
	Role       string                 `json:"role,omitempty"`
	Email      string                 `json:"email,omitempty"`
	SessionID  string                 `json:"session_id,omitempty"`
	DeviceInfo string                 `json:"device_info,omitempty"`
	IPAddress  string                 `json:"ip_address,omitempty"`
	TokenType  string                 `json:"token_type,omitempty"`
	CustomData map[string]interface{} `json:"custom_data,omitempty"`
}

func ExtractClaims

func ExtractClaims(tokenString string) *Claims

func ValidateToken

func ValidateToken(tokenString string) (*Claims, error)

type JWTConfig

type JWTConfig struct {
	SecretKey            []byte
	Issuer               string
	AccessTokenDuration  time.Duration
	RefreshTokenDuration time.Duration
	SecurityLevel        security.Level
}

type JWTManager

type JWTManager struct {
	// contains filtered or unexported fields
}

func GetDefault

func GetDefault() *JWTManager

func NewJWTManager

func NewJWTManager(config JWTConfig) (*JWTManager, error)

func (*JWTManager) GenerateAccessToken

func (m *JWTManager) GenerateAccessToken(claims Claims) (string, error)

func (*JWTManager) GenerateRefreshToken

func (m *JWTManager) GenerateRefreshToken(claims Claims) (string, error)

func (*JWTManager) GetConfig

func (m *JWTManager) GetConfig() JWTConfig

func (*JWTManager) RefreshAccessToken

func (m *JWTManager) RefreshAccessToken(refreshTokenString string) (string, error)

func (*JWTManager) ValidateToken

func (m *JWTManager) ValidateToken(tokenString string) (*Claims, error)

type MemorySessionStore

type MemorySessionStore struct {
	// contains filtered or unexported fields
}

MemorySessionStore es una implementación en memoria de SessionStore. NO es adecuada para producción (no persiste, no es distribuida). Úsala solo para desarrollo, testing o aplicaciones de un solo proceso.

func NewMemorySessionStore

func NewMemorySessionStore() *MemorySessionStore

NewMemorySessionStore crea un nuevo almacenamiento en memoria.

func (*MemorySessionStore) CleanExpired

func (s *MemorySessionStore) CleanExpired() (int, error)

CleanExpired elimina todas las sesiones expiradas.

func (*MemorySessionStore) Delete

func (s *MemorySessionStore) Delete(sessionID string) error

Delete elimina una sesión.

func (*MemorySessionStore) DeleteByUserID

func (s *MemorySessionStore) DeleteByUserID(userID string) error

DeleteByUserID elimina todas las sesiones de un usuario.

func (*MemorySessionStore) Get

func (s *MemorySessionStore) Get(sessionID string) (*Session, error)

Get recupera una sesión por su ID. Devuelve una copia para que las modificaciones del llamador (p. ej. actualizar LastActivityAt antes de llamar a Save) no muten el estado interno del store fuera de su mutex.

func (*MemorySessionStore) GetByUserID

func (s *MemorySessionStore) GetByUserID(userID string) ([]*Session, error)

GetByUserID recupera todas las sesiones de un usuario. Devuelve copias por la misma razón que Get.

func (*MemorySessionStore) Save

func (s *MemorySessionStore) Save(session *Session) error

Save guarda una sesión en memoria.

type Session

type Session struct {
	// ID es el identificador único de la sesión (generado criptográficamente).
	ID string

	// UserID es el identificador del usuario propietario de la sesión.
	UserID string

	// Username es el nombre de usuario (opcional, para logging/auditoría).
	Username string

	// IPAddress es la IP desde donde se creó la sesión.
	IPAddress string

	// UserAgent es el User-Agent del navegador/cliente.
	UserAgent string

	// DeviceInfo contiene información adicional del dispositivo (opcional).
	DeviceInfo string

	// CreatedAt es el momento en que se creó la sesión.
	CreatedAt time.Time

	// LastActivityAt es el momento de la última actividad del usuario.
	// Se actualiza en cada validación exitosa para implementar idle timeout.
	LastActivityAt time.Time

	// ExpiresAt es el momento de expiración absoluta de la sesión.
	// Después de este tiempo, la sesión es inválida sin importar la actividad.
	ExpiresAt time.Time

	// IdleTimeout es el tiempo máximo de inactividad permitido.
	// Si pasa más tiempo que esto desde LastActivityAt, la sesión expira.
	IdleTimeout time.Duration

	// IsValid indica si la sesión está activa (no ha sido revocada).
	IsValid bool

	// RevokedAt es el momento en que la sesión fue revocada (si aplica).
	// Si es zero, la sesión no ha sido revocada.
	RevokedAt time.Time

	// RevokeReason indica la razón de la revocación (opcional, para auditoría).
	RevokeReason string
}

Session representa una sesión de usuario autenticada. Contiene toda la información necesaria para validar y auditar la sesión a lo largo de su ciclo de vida.

func GetQuickUserSessions

func GetQuickUserSessions(userID string) ([]*Session, error)

GetQuickUserSessions obtiene las sesiones activas de un usuario.

func ValidateQuickSession

func ValidateQuickSession(sessionID string) (*Session, error)

ValidateQuickSession valida una sesión usando el manager global.

func (*Session) IsActive

func (s *Session) IsActive() bool

IsActive verifica si la sesión está activa (válida y no expirada).

func (*Session) IsExpired

func (s *Session) IsExpired() bool

IsExpired verifica si la sesión ha expirado por tiempo absoluto o inactividad.

type SessionConfig

type SessionConfig struct {
	// SessionTimeout es el tiempo máximo absoluto de vida de una sesión.
	// Si es 0, se usa el valor predeterminado del nivel de seguridad.
	SessionTimeout time.Duration

	// IdleTimeout es el tiempo máximo de inactividad permitido.
	// Si es 0, se usa el valor predeterminado del nivel de seguridad.
	IdleTimeout time.Duration

	// MaxConcurrentSessions es el número máximo de sesiones activas por usuario.
	// Si es 0, se usa el valor predeterminado del nivel de seguridad.
	// Cuando se supera este límite, las sesiones más antiguas se revocan.
	MaxConcurrentSessions int

	// SecurityLevel define el nivel de seguridad para usar valores predeterminados.
	// Si no se especifica, se usa LevelMedium.
	SecurityLevel security.Level

	// Store es el almacenamiento de sesiones a utilizar.
	// Si es nil, se usa MemorySessionStore (solo para desarrollo/testing).
	Store SessionStore
}

SessionConfig define la configuración para el manager de sesiones.

type SessionInfo

type SessionInfo struct {
	UserID     string
	Username   string
	IPAddress  string
	UserAgent  string
	DeviceInfo string
}

CreateSession crea una nueva sesión para el usuario especificado. Si el usuario ya tiene el máximo de sesiones concurrentes permitidas, las sesiones más antiguas se revocan automáticamente.

Retorna el ID de la nueva sesión, que debe ser enviado al cliente (típicamente en una cookie HttpOnly o en el cuerpo de la respuesta).

Ejemplo de uso:

sessionID, err := sessionManager.CreateSession(token.SessionInfo{
    UserID:    "user-123",
    Username:  "john_doe",
    IPAddress: "192.168.1.100",
    UserAgent: "Mozilla/5.0...",
})
if err != nil {
    // Manejar error
}
// Enviar sessionID al cliente (cookie o respuesta)

type SessionManager

type SessionManager struct {
	// contains filtered or unexported fields
}

SessionManager maneja el ciclo de vida completo de las sesiones de usuario.

func GetDefaultSession

func GetDefaultSession() *SessionManager

GetDefaultSession devuelve la instancia global actual del SessionManager.

func NewSessionManager

func NewSessionManager(config SessionConfig) *SessionManager

NewSessionManager crea un nuevo manager de sesiones con la configuración proporcionada. Si no se especifica un Store, se usa MemorySessionStore (solo para desarrollo).

IMPORTANTE: Para producción, DEBES proporcionar un SessionStore persistente (Redis, base de datos, etc.). MemorySessionStore pierde datos al reiniciar.

Ejemplo de uso:

// Con valores predeterminados del nivel de seguridad
manager := token.NewSessionManager(token.SessionConfig{
    SecurityLevel: security.LevelHigh,
})

// Con configuración personalizada y Redis (ejemplo conceptual)
manager := token.NewSessionManager(token.SessionConfig{
    SessionTimeout:        8 * time.Hour,
    IdleTimeout:           15 * time.Minute,
    MaxConcurrentSessions: 2,
    Store:                 redisStore, // Implementación personalizada
})

func (*SessionManager) CleanExpiredSessions

func (m *SessionManager) CleanExpiredSessions() (int, error)

CleanExpiredSessions elimina todas las sesiones expiradas del almacenamiento. Debe llamarse periódicamente (ej. cada hora con un cron job) para evitar que el almacenamiento crezca indefinidamente.

Ejemplo de uso:

// En un goroutine de mantenimiento
go func() {
    ticker := time.NewTicker(1 * time.Hour)
    for range ticker.C {
        cleaned, _ := sessionManager.CleanExpiredSessions()
        log.Info("Sesiones expiradas limpiadas: %d", cleaned)
    }
}()

func (*SessionManager) CreateSession

func (m *SessionManager) CreateSession(info SessionInfo) (string, error)

func (*SessionManager) GetConfig

func (m *SessionManager) GetConfig() SessionConfig

GetConfig retorna la configuración actual del manager.

func (*SessionManager) GetSession

func (m *SessionManager) GetSession(sessionID string) (*Session, error)

GetSession recupera una sesión por su ID. Retorna ErrSessionNotFound si la sesión no existe.

func (*SessionManager) GetUserSessions

func (m *SessionManager) GetUserSessions(userID string) ([]*Session, error)

GetUserSessions recupera todas las sesiones activas de un usuario. Útil para mostrar al usuario "Dónde estás conectado" en su perfil.

Ejemplo de uso:

sessions, err := sessionManager.GetUserSessions("user-123")
for _, s := range sessions {
    fmt.Printf("Sesión desde %s, creada en %s\n", s.IPAddress, s.CreatedAt)
}

func (*SessionManager) RevokeAllUserSessions

func (m *SessionManager) RevokeAllUserSessions(userID, reason string) error

RevokeAllUserSessions revoca todas las sesiones de un usuario. Útil para:

  • Cambio de contraseña (invalidar todas las sesiones anteriores)
  • Sospecha de compromiso de cuenta
  • Logout global ("cerrar sesión en todos los dispositivos")

Ejemplo de uso:

err := sessionManager.RevokeAllUserSessions("user-123", "password_changed")

func (*SessionManager) RevokeSession

func (m *SessionManager) RevokeSession(sessionID, reason string) error

RevokeSession revoca una sesión específica (logout).

Ejemplo de uso:

err := sessionManager.RevokeSession(sessionID, "user_logout")

func (*SessionManager) ValidateSession

func (m *SessionManager) ValidateSession(sessionID string) (*Session, error)

ValidateSession valida una sesión y actualiza su tiempo de última actividad. Retorna la sesión si es válida, o un error si está expirada, revocada o no existe.

Este método debe llamarse en CADA request autenticado para:

  • Verificar que la sesión sigue activa
  • Actualizar el LastActivityAt (para idle timeout)
  • Detectar sesiones revocadas (logout en otro dispositivo)

Ejemplo de uso:

session, err := sessionManager.ValidateSession(sessionID)
if err != nil {
    // Sesión inválida, requerir re-login
    return security.ErrSessionExpired
}
// Sesión válida, continuar con el request
userID := session.UserID

type SessionStore

type SessionStore interface {
	// Save guarda una sesión en el almacenamiento.
	Save(session *Session) error

	// Get recupera una sesión por su ID.
	// Retorna ErrSessionNotFound si no existe.
	Get(sessionID string) (*Session, error)

	// GetByUserID recupera todas las sesiones activas de un usuario.
	GetByUserID(userID string) ([]*Session, error)

	// Delete elimina una sesión del almacenamiento.
	Delete(sessionID string) error

	// DeleteByUserID elimina todas las sesiones de un usuario.
	DeleteByUserID(userID string) error

	// CleanExpired elimina todas las sesiones expiradas del almacenamiento.
	// Útil para tareas de mantenimiento periódico.
	CleanExpired() (int, error)
}

SessionStore define el contrato para los backends de almacenamiento de sesiones. Esta abstracción permite usar diferentes backends (memoria, Redis, base de datos) sin modificar el código del manager.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL