package model import "time" // RefreshToken 刷新令牌。 // access token(JWT) 只有 2 小时,过期后用它换新的,用户不必重新登录; // 库里只存 sha256,即使数据库泄露也换不出可用令牌。 // 每次刷新都会轮换(旧的立即作废),旧令牌被再次使用视为泄露。 type RefreshToken struct { Base TokenHash string `gorm:"size:64;uniqueIndex" json:"-"` Kind string `gorm:"size:16;index" json:"kind"` // user | admin SubjectID string `gorm:"size:24;index" json:"subject_id"` // 用户 ID 或管理员 ID ExpiresAt time.Time `gorm:"index" json:"expires_at"` RevokedAt *time.Time `json:"revoked_at"` // 作废原因:rotate=正常轮换(有宽限期)/ logout=主动退出 / reuse=检测到泄露被连坐吊销。 // 只有 rotate 允许宽限期内再用一次,否则「吊销全部会话」会被宽限期架空。 RevokedReason string `gorm:"size:16" json:"revoked_reason"` }