Apéndice A: Referencia de la API REST
La comunicación entre el cliente React y el backend de Spring Boot se realiza mediante una API REST sin estado (stateless) protegida mediante tokens portadores JWT de Auth0.
Todas las peticiones a la API (excepto aquellas bajo la ruta abierta /public/**) deben adjuntar la cabecera HTTP estándar:
Authorization: Bearer <TOKEN_JWT>
👤 Endpoint de Usuarios
Obtener o Auto-aprovisionar Usuario
Retorna la información del usuario autenticado. Si el perfil realiza su primera solicitud, el endpoint crea el registro correspondiente de manera automática en la base de datos PostgreSQL local.
- Dirección:
GET /users/me - Respuesta exitosa
200 OK:{"id": "a69f2342-d6ef-466d-8854-1506bfec388b","auth0Id": "auth0|65fbc08...","email": "usuario@ejemplo.com","name": "Alex Desarrollador","createdAt": "2026-05-30T12:00:00Z"}
📁 Endpoints de Proyectos
Registrar Nuevo Proyecto
- Dirección:
POST /projects - Cuerpo de la Petición (Request Body):
{"name": "Mi Tienda Virtual","targetUrl": "https://secure-shop.local"}
- Respuesta exitosa
201 Created:{"id": "b328120d-773a-4424-9ea9-a0eb2cd43cb5","name": "Mi Tienda Virtual","targetUrl": "https://secure-shop.local","createdAt": "2026-05-30T12:15:30Z"}
Listar Mis Proyectos
Retorna una colección con todos los proyectos administrados por el usuario autenticado.
- Dirección:
GET /projects - Respuesta exitosa
200 OK:[{"id": "b328120d-773a-4424-9ea9-a0eb2cd43cb5","name": "Mi Tienda Virtual","targetUrl": "https://secure-shop.local","createdAt": "2026-05-30T12:15:30Z"}]
Eliminar Proyecto
Remueve permanentemente un proyecto web, eliminando por cascada sus vulnerabilidades asociadas y todos los históricos de reportes de escaneo.
- Dirección:
DELETE /projects/{id} - Respuesta exitosa
204 No Content
⚡ Endpoints del Motor de Escaneo
Despachar Análisis de Seguridad
Despierta de manera concurrente los escáneres configurados para verificar el sitio web objetivo. Retorna el consolidado final y el objeto reporte formateado en Markdown en la base de datos.
- Dirección:
POST /scan - Cuerpo de la Petición:
{"targetUrl": "https://example.com","selectedCategories": ["A2", "A3"],"projectId": "b328120d-773a-4424-9ea9-a0eb2cd43cb5","projectName": null}
- Respuesta exitosa
200 OK:{"success": true,"message": "Escaneo completado exitosamente","projectId": "b328120d-773a-4424-9ea9-a0eb2cd43cb5","projectName": "Mi Tienda Virtual","targetUrl": "https://example.com","vulnerabilitiesFound": 1,"scanCategories": [{"code": "A2","displayName": "Web A2 - Fallos Criptográficos","description": "Exposición de datos sensibles / TLS mal configurado"}],"report": {"id": "ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b","reportUrl": "reports/b328120d-773a-4424-9ea9-a0eb2cd43cb5/ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b.md","createdAt": "2026-05-30T12:20:45Z"}}
🛡️ Endpoints de Vulnerabilidades
Consultar Vulnerabilidades de un Proyecto
- Dirección:
GET /projects/{id}/vulnerabilities - Parámetros Opcionales de Consulta (Query Params):
type(ej.DAST,SASTpara filtrar el tipo de análisis) - Respuesta exitosa
200 OK:[{"id": "e4586d1f-8802-40f4-9b1e-6277a8d50bf2","analysisType": "DAST","owaspCategory": "WEB_A02_CRYPTOGRAPHIC_FAILURES","severity": "HIGH","description": "Cabecera Strict-Transport-Security (HSTS) ausente.","evidence": "Cabeceras HTTP examinadas en la respuesta. No se encontró la directiva HSTS.","recommendation": "Configure el servidor de producción para transmitir la cabecera 'Strict-Transport-Security' con un tiempo de vigencia amplio (por ejemplo, 'max-age=31536000; includeSubDomains').","createdAt": "2026-05-30T12:20:45Z"}]
📄 Endpoints de Reportes y Descargas
Listar Reportes por Proyecto
- Dirección:
GET /projects/{projectId}/reports - Respuesta exitosa
200 OK:[{"id": "ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b","reportUrl": "reports/b328120d-773a-4424-9ea9-a0eb2cd43cb5/ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b.md","createdAt": "2026-05-30T12:20:45Z"}]
Obtener Detalle y Enlace de Descarga de un Reporte
Retorna la información del reporte y genera una URL de descarga temporal prefirmada de Oracle Cloud Object Storage de 7 días cuando opera en Modo Producción.
- Dirección:
GET /reports/{id} - Respuesta exitosa
200 OK:{"id": "ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b","reportUrl": "reports/b328120d-773a-4424-9ea9-a0eb2cd43cb5/ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b.md","createdAt": "2026-05-30T12:20:45Z","downloadUrl": "https://objectstorage.us-ashburn-1.oraclecloud.com/p/tu-firma-par/n/tu-namespace/b/tvapymm-reports-bucket/o/reports/b328120d-773a-4424-9ea9-a0eb2cd43cb5/ee0c1a2f-fb8a-4933-9118-cb152fbe2d2b.md"}