9153a20384
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
2.3 KiB
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. |
|
|
|
false | error_go_core |
|
|
Session con token opaco listo para devolver al cliente via header o cookie | true |
|
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.