Files
egutierrez 9153a20384 feat: session_create, session_validate, session_cleanup
Fase 3 del issue 0010 — sesiones SQLite como alternativa a JWT.
- Tabla sessions creada con CREATE TABLE IF NOT EXISTS (autosetup)
- Tokens de 32 bytes aleatorios (crypto/rand) codificados en hex (256 bits)
- Indices en user_id y expires_at
- Prepared statements para evitar SQL injection
- SessionCleanup para eliminar expiradas periodicamente
2026-04-18 17:40:13 +02:00

2.3 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
session_create function go infra 1.0.0 impure func SessionCreate(db *sql.DB, userID string, ttl time.Duration, metadata map[string]any) (Session, error) Crea una sesion SQLite con token aleatorio de 32 bytes hex (256 bits de entropia). Crea la tabla sessions si no existe. Retorna la Session lista para devolver al cliente.
session
auth
sqlite
token
infra
Session_go_infra
Session_go_infra
false error_go_core
crypto/rand
database/sql
encoding/hex
encoding/json
fmt
time
name desc
db conexion SQL abierta a la BD de la app. No debe ser nil
name desc
userID identificador del usuario al que pertenece la sesion. No vacio
name desc
ttl tiempo de vida de la sesion (time.Duration). Debe ser positivo
name desc
metadata datos libres a persistir junto a la sesion (role, email, ip, etc.). Puede ser nil
Session con token opaco listo para devolver al cliente via header o cookie true
crea sesion y persiste en BD
genera tokens distintos
rechaza db nil
rechaza user_id vacio
functions/infra/session_test.go functions/infra/session_create.go

Ejemplo

db, _ := sql.Open("sqlite3", "app.db")
session, err := SessionCreate(db, user.ID, 24*time.Hour, map[string]any{
    "email": user.Email,
    "role":  "admin",
    "ip":    r.RemoteAddr,
})
if err != nil {
    HTTPErrorResponse(w, HTTPError{Status: 500, Code: "session_error", Message: err.Error()})
    return
}
HTTPJSONResponse(w, 200, map[string]string{"token": session.Token})

Notas

Impura — hace I/O en SQLite, usa entropia del OS con crypto/rand, y lee el tiempo con time.Now(). La tabla sessions se crea con CREATE TABLE IF NOT EXISTS (PK token, indices en user_id y expires_at) para que la primera llamada deje todo listo sin setup manual. Token es 32 bytes aleatorios codificados en hex = 64 chars, 256 bits de entropia. Session fixation mitigada: el token lo genera el servidor, no se acepta del cliente. Para invalidar una sesion: DELETE FROM sessions WHERE token = ?. Limpieza periodica de expiradas: SessionCleanup.