Agrega API Keys scoped (token + IP obligatoria + alcance) para /api/v2
Alternativa al ADMIN_API_KEY único de entorno, que sigue funcionando como llave maestra para no romper integraciones existentes. - Modelo ApiKey: token hasheado, IP/CIDR obligatoria (fail-closed sin IP), scopes habilitados, último uso (fecha + IP). - AdminApiAuth() acepta ahora tanto la llave maestra como una ApiKey; nuevo middleware RequireScope(scope) para gatear grupos de rutas. - Fase 1: scopes aplicados a lo más sensible — oss (archivos), query_runner (SQL arbitrario), usuarios (usuarios/roles/módulos), pasarelas (credenciales de pago). El resto de /api/v2 sigue con la llave maestra hasta una fase 2. - Panel /app/api-keys: crear/editar/revocar, token visible solo al crear, scopes por checkbox, IP obligatoria.
This commit is contained in:
@@ -122,6 +122,8 @@ func Migrate() {
|
||||
&models.UmindDocumento{},
|
||||
&models.UmindChunk{},
|
||||
&models.UmindMensaje{},
|
||||
// API Keys de /api/v2 (token + IP obligatoria + scopes)
|
||||
&models.ApiKey{},
|
||||
}
|
||||
for _, m := range modelosPrincipales {
|
||||
if err := app.Http.Database.DB.Migrator().AutoMigrate(m); err != nil {
|
||||
@@ -1309,3 +1311,40 @@ func SeedUmind() {
|
||||
}
|
||||
log.Println("[SEED] Seed de uMind completado.")
|
||||
}
|
||||
|
||||
// SeedApiKeys registra el submódulo del panel de administración de API Keys
|
||||
// (credenciales scoped para /api/v2, alternativa al ADMIN_API_KEY maestro).
|
||||
func SeedApiKeys() {
|
||||
db := app.Http.Database.DB
|
||||
var modulo models.Modules
|
||||
if err := db.Where("title = ?", "Administración").First(&modulo).Error; err != nil {
|
||||
log.Println("[SEED] Módulo 'Administración' no encontrado, se omite SeedApiKeys")
|
||||
return
|
||||
}
|
||||
url := "/app/api-keys"
|
||||
var sub models.Submodules
|
||||
if err := db.Where("url = ?", url).First(&sub).Error; err != nil {
|
||||
sub = models.Submodules{
|
||||
Title: "API Keys",
|
||||
Description: "Credenciales scoped para /api/v2 (token + IP + alcance), alternativa a la llave maestra",
|
||||
Url: url,
|
||||
ModuleId: modulo.ID,
|
||||
ModifiedAt: time.Now(),
|
||||
}
|
||||
if err := db.Create(&sub).Error; err != nil {
|
||||
log.Printf("[SEED] Error creando submódulo 'API Keys': %v", err)
|
||||
return
|
||||
}
|
||||
log.Printf("[SEED] Submódulo 'API Keys' creado")
|
||||
} else if sub.ModuleId != modulo.ID {
|
||||
db.Model(&sub).Update("module_id", modulo.ID)
|
||||
}
|
||||
var rol models.Roles
|
||||
if err := db.Where("name = ?", "Administrador").First(&rol).Error; err != nil {
|
||||
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
|
||||
} else {
|
||||
asignarSubmodulosSiFaltan(&rol, []models.Submodules{sub})
|
||||
log.Printf("[SEED] Submódulo 'API Keys' asignado al rol 'Administrador'")
|
||||
}
|
||||
log.Println("[SEED] Seed de API Keys completado.")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user