# Servidor Web API Seguro con JWT y OpenAPI 馃攼馃殌
`bgustscraper` no es solo una CLI de raspado, tambi茅n es una soluci贸n SaaS que expone los datos recolectados y la cach茅 a trav茅s de una **API HTTP de alto rendimiento** escrita en Rust utilizando el framework as铆ncrono **Axum**.
---
## 馃攽 1. Autenticaci贸n JSON Web Tokens (JWT)
Para proteger la integridad de los datos, todos los endpoints del servidor web (a excepci贸n del endpoint p煤blico de login y OpenAPI) requieren de autenticaci贸n estricta basada en JWT.
### Flujo de Trabajo:
1. **Petici贸n POST `/api/auth`:**
* Env铆as credenciales JSON `{ "username": "admin", "password": "..." }`.
* Rust valida contra las variables de entorno configuradas (`API_USER` y `API_PASS`).
2. **Generaci贸n del Token (`src/auth.rs`):**
* Si son v谩lidas, Rust crea los claims configurando la expiraci贸n (`exp`) a **2 horas** a partir del tiempo actual de UTC.
* Firma el token criptogr谩ficamente usando el algoritmo HS256 y tu clave secreta `JWT_SECRET`.
3. **Extractor Bearer en Axum (`src/api.rs`):**
* Implementamos un extractor de tipo en Rust para Axum (`impl FromRequestParts for Claims`).
* Para cada endpoint protegido, Axum extrae la cabecera `Authorization`, verifica que comience con `Bearer `, decodifica el token, y rechaza la petici贸n con `401 Unauthorized` si est谩 vencido o es inv谩lido, sin llegar a ejecutar el controlador de la ruta.
---
## 馃摗 2. Cat谩logo de Endpoints de la API
### POST `/api/auth`
Autentica el acceso y entrega el token.
* **Request JSON:**
```json
{
"username": "admin",
"password": "change_me"
}
```
* **Response JSON (200 OK):**
```json
{
"token": "ey..."
}
```
### GET `/api/bcv` (Protegido por JWT)
Retorna la 煤ltima captura sem谩ntica del d贸lar/euro recolectada por el planificador desatendido.
* **Headers requeridos:** `Authorization: Bearer <token>`
* **Response JSON (200 OK):**
```json
{
"USD": 36.45,
"EUR": 39.12
}
```
### GET `/api/cache` (Protegido por JWT)
Retorna los metadatos y estado de integridad de la base de datos embebida `redb`.
* **Headers requeridos:** `Authorization: Bearer <token>`
* **Response JSON (200 OK):**
```json
{
"database_path": "downloads/cache.db",
"status": "active",
"storage_engine": "redb",
"info": "La base de datos embebida redb est谩 en ejecuci贸n y securizada."
}
```
### GET `/api/openapi.json` (P煤blico)
Retorna la especificaci贸n OpenAPI 3.0 completa en JSON del servidor para su consumo en Swagger UI u otras herramientas externas.
---
## 馃寪 3. Middlewares y CORS
El servidor incluye la capa `tower-http::cors::CorsLayer` permisiva, posibilitando que clientes desarrollados en frontend modernos (React, Angular, Svelte) alojados en otros dominios o puertos se conecten a la API sin sufrir bloqueos CORS.