# Sistema de Tokens

## Descripción

El sistema de tokens permite autenticar las requests de facturas sin necesidad de pasar la contraseña del certificado en cada request.

## Flujo de Uso

### 1. Obtener Clave Pública

```bash
curl http://localhost:6789/api/v1/auth/public-key
```

Response:
```json
{"public_key": "base64..."}
```

### 2. Descifrar clave pública

El cliente debe descifrar la clave pública RSA (codificada en base64) y usarla para cifrar la contraseña.

### 3. Registrar Certificado

```bash
curl -X POST http://localhost:6789/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "cert_name": "personal",
    "cert_path": "C:/ruta/al/cert.p12",
    "password_encrypted": "base64_cifrada"
  }'
```

Response:
```json
{
  "success": true,
  "cert": {
    "subject": "...",
    "days_until_expiry": 816
  },
  "token": "A1B2C3D4E5F6..."
}
```

### 4. Usar Token en Facturas (futuro)

El token se pasados en el header `Authorization`:

```bash
curl -X POST http://localhost:6789/api/v1/facturas \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer A1B2C3D4E5F6..." \
  -d '{...}'
```

## Almacenamiento

Los tokens se almacenan en memoria (`map[string]*Certificate`) junto con:

- ID del certificado
- Ruta al archivo .p12
- Contraseña descifrada

## Seguridad

- Los tokens son strings aleatorios de 32 bytes codificados en hex mayúscula
- Solo se almacena en memoria (se pierde al reiniciar la API)
- La contraseña nunca se expone en responses
- El token permite ejecutar operaciones con el certificado registrado

## Consideraciones

1. **Sesiones efímeras**: Al reiniciar la API se pierden los tokens
2. **Un token por certificado**: Si registras el mismo cert, se genera nuevo token
3. **Varios certificados**: Se puede registrar más de un certificado, cada uno con su token

## Estado Actual

Actualmente los tokens se generan pero no se usan en las requests de facturas. El sistema usa el certificado registrado directamente.