API gratuito para proyectos personales: claves autónomas y límites de tasa
Los desarrolladores suelen mostrar aplicaciones frontend en entrevistas usando datos de localStorage o jsonplaceholder. Esto simplifica el desarrollo sin costes de servidor, pero genera datos estáticos y retrasos artificiales mediante setTimeout. ¿Una mejor alternativa? Una plataforma con APIs reales donde puedas subir tus propios datos. La configuración toma solo minutos—sin necesidad de backend.
La arquitectura utiliza Next.js para la interfaz web con SSG, Node.js/Express para gestionar usuarios y claves, y un servicio API dedicado. Todo funciona en Docker con un proxy Nginx.
Desafíos del acceso gratuito y la solución con claves API
Sin límites, cualquiera podría inundar el sistema con solicitudes spam, agotando rápidamente los recursos. La estrategia clave: minimizar las consultas a la base de datos y filtrar claves inválidas al momento de parsearlas.
Las claves son autónomas, con formato ppk_version_usuario_nonce_firma. La autenticación usa: Authorization: PetProjects ppk_v1_1_nonce_firma.
La validación se realiza en dos pasos:
- Validación local: se comprueba la estructura y la firma HMAC sin acceder a la base de datos.
- Búsqueda en la base de datos para el userId solo después de confirmar la validez inicial.
function validateApiKey(apiKey: string): ApiKeyPayload | null {
if (!apiKey.startsWith('ppk_')) return null;
const parts = apiKey.split('_');
if (parts.length !== 5) return null;
const [, version, userIdRaw, nonce, signature] = parts;
const userId = Number(userIdRaw);
if (!Number.isInteger(userId)) return null;
if (!signature || !/^[a-f0-9]{64}$/.test(signature)) return null;
const payload = `${version}.${userId}.${nonce}`;
const expectedSignature = crypto.createHmac('sha256', API_KEY_SECRET).update(payload).digest('hex');
if (signature.length !== expectedSignature.length) return null;
const isValid = crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expectedSignature, 'hex'));
if (!isValid) return null;
return { version, userId, nonce };
}
timingSafeEqual evita ataques por tiempo. Las claves válidas se almacenan en LRUCache (máximo: 10.000 entradas, TTL: 5 minutos).
Equilibrio entre caché y rendimiento
La caché reduce la latencia y la carga en la base de datos. El TTL de 5 minutos es un compromiso: si una clave se filtra, permanece activa hasta su expiración, luego requiere revalidación.
Limitaciones:
- No hay revocación instantánea de claves.
- Las claves filtradas siguen siendo válidas hasta que expiren.
- Los secretos deben protegerse.
Mejoras potenciales: soporte de listas negras, versionado de claves y revocación dinámica.
Entorno interactivo para pruebas de API
Una interfaz interactiva permite enviar solicitudes directamente desde el navegador con claves prellenadas. Genera ejemplos de código para múltiples lenguajes.
Ejemplo POST:
curl -L -X POST 'https://api.pet-projects.io/rest/free' \
-H 'Authorization: PetProjects ppk_v1_1_a1b2c3d4e5_a1b2c3d4e5f6g7h8i10j11' \
-H 'Content-Type: application/json' \
-d '{
— Editorial Team
Aún no hay comentarios.