// Package session : sessions utilisateurs stockées côté serveur dans Redis. // Tokens opaques aléatoires (révocables), pas de JWT. package session import ( "context" "crypto/rand" "encoding/base64" "time" ) // CookieName : nom du cookie de session (httpOnly). const CookieName = "omnex_session" // Session : données associées à un token de session. type Session struct { UserID string `json:"user_id"` Role string `json:"role"` CreatedAt time.Time `json:"created_at"` } // Manager : cycle de vie des sessions. type Manager interface { // Create génère un token opaque et persiste la session (TTL appliqué). Create(ctx context.Context, s Session) (token string, err error) // Get récupère une session par token (found=false si absente/expirée). Get(ctx context.Context, token string) (s Session, found bool, err error) // Delete révoque une session (logout). Delete(ctx context.Context, token string) error // TTL renvoie la durée de vie configurée. TTL() time.Duration } // newToken génère un token de session cryptographiquement aléatoire (256 bits). func newToken() (string, error) { b := make([]byte, 32) if _, err := rand.Read(b); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(b), nil }