Documentation
¶
Index ¶
- Constants
- Variables
- func CreateQuickSession(info SessionInfo) (string, error)
- func ExtractUserID(tokenString string) string
- func GenerateAccessToken(claims Claims) (string, error)
- func GenerateQuickToken(userID, role string) (string, error)
- func GenerateQuickTokenWithEmail(userID, email, role string) (string, error)
- func GenerateRefreshToken(claims Claims) (string, error)
- func GetSessionUserID(sessionID string) string
- func Init(config JWTConfig) error
- func InitSession(config SessionConfig) error
- func QuickSessionExists(sessionID string) bool
- func RefreshAccessToken(refreshTokenString string) (string, error)
- func RevokeAllQuickSessions(userID, reason string) error
- func RevokeQuickSession(sessionID, reason string) error
- func ValidateQuickToken(tokenString string) bool
- type Claims
- type JWTConfig
- type JWTManager
- func (m *JWTManager) GenerateAccessToken(claims Claims) (string, error)
- func (m *JWTManager) GenerateRefreshToken(claims Claims) (string, error)
- func (m *JWTManager) GetConfig() JWTConfig
- func (m *JWTManager) RefreshAccessToken(refreshTokenString string) (string, error)
- func (m *JWTManager) ValidateToken(tokenString string) (*Claims, error)
- type MemorySessionStore
- func (s *MemorySessionStore) CleanExpired() (int, error)
- func (s *MemorySessionStore) Delete(sessionID string) error
- func (s *MemorySessionStore) DeleteByUserID(userID string) error
- func (s *MemorySessionStore) Get(sessionID string) (*Session, error)
- func (s *MemorySessionStore) GetByUserID(userID string) ([]*Session, error)
- func (s *MemorySessionStore) Save(session *Session) error
- type Session
- type SessionConfig
- type SessionInfo
- type SessionManager
- func (m *SessionManager) CleanExpiredSessions() (int, error)
- func (m *SessionManager) CreateSession(info SessionInfo) (string, error)
- func (m *SessionManager) GetConfig() SessionConfig
- func (m *SessionManager) GetSession(sessionID string) (*Session, error)
- func (m *SessionManager) GetUserSessions(userID string) ([]*Session, error)
- func (m *SessionManager) RevokeAllUserSessions(userID, reason string) error
- func (m *SessionManager) RevokeSession(sessionID, reason string) error
- func (m *SessionManager) ValidateSession(sessionID string) (*Session, error)
- type SessionStore
Constants ¶
const ( TokenTypeAccess = "access" TokenTypeRefresh = "refresh" )
Variables ¶
var ( ErrJWTInvalid = errors.New("token JWT inválido") ErrJWTExpired = errors.New("token JWT expirado") ErrJWTSigningMethodInvalid = errors.New("método de firma JWT inválido") )
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 GenerateAccessToken ¶
func GenerateQuickToken ¶
func GenerateRefreshToken ¶
func GetSessionUserID ¶
GetSessionUserID extrae el UserID de una sesión válida. Retorna string vacío si la sesión es inválida.
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 ¶
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 RevokeAllQuickSessions ¶
RevokeAllQuickSessions revoca todas las sesiones de un usuario.
func RevokeQuickSession ¶
RevokeQuickSession revoca una sesión usando el manager global.
func ValidateQuickToken ¶
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 ValidateToken ¶
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 ¶
GetQuickUserSessions obtiene las sesiones activas de un usuario.
func ValidateQuickSession ¶
ValidateQuickSession valida una sesión usando el manager global.
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.