Bezplatný API pro pet-projekty: samostatné klíče a ochrana proti přetížení
Vývojáři na pohovorech často ukazují frontendové aplikace s daty z localStorage nebo jsonplaceholder. To zjednodušuje vývoj bez nákladů na server, ale vede k statickým datům a simulaci zpoždění pomocí setTimeout. Alternativou je platforma s reálnými API, kam se nahrávají uživatelská data. Spuštění trvá minutu, backend není vyžadován.
Architektura zahrnuje Next.js pro webové rozhraní s SSG, Node.js/Express pro správu uživatelů a klíčů, samostatný službu pro API. Vše je v Dockeru s Nginx proxy.
Problémy bezplatného přístupu a řešení prostřednictvím API klíčů
Bez omezení může každý uživatel generovat spamové požadavky, což rychle vyčerpává prostředky. Klíčový přístup – minimalizace dotazů do databáze a odstranění neplatných klíčů již při parsování.
Klíče jsou samostatné, formát: ppk_version_userId_nonce_signature. Autentizace: Authorization: PetProjects ppk_v1_1_nonce_signature.
Ověření ve dvou krocích:
- Lokální ověření: struktura, HMAC podpis bez databáze.
- Ověření userId v databázi pouze pro platné klíče.
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 zabrání timing-útokům. Platné klíče jsou mezipaměťovány v LRUCache (max: 10 000, TTL: 5 minut).
Mezipaměť a vyváženost výkonu
Mezipaměť snižuje latenci a zatížení databáze. TTL 5 minut je kompromis: při úniku klíče funguje omezeně, poté vyžaduje ověření.
Omezení:
- Neexistuje okamžitý odvolání klíčů.
- Únik je aktivní až do TTL.
- Tajemství vyžaduje ochranu.
Případné vylepšení: blacklist, verze, odvolání klíčů.
Playground pro testování API
Interaktivní rozhraní umožňuje posílat požadavky přímo z prohlížeče s automatickým doplňováním klíče. Generuje příklady pro různé jazyky.
Příklad 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 '{"hello":"world"}'
Odpověď ve formátu JSend:
{
"status": "success",
"data": {
"id": 99,
"payload": {
"hello": "world"
},
"createdAt": 1774297745939,
"updatedAt": 1774297745939
}
}
Škálování a budoucí vylepšení
Systém minimalizuje dotazy do databáze, chrání proti zneužití a vyváží bezpečnost a rychlost. Při růstu zátěže bude nutné monitorovat mezipaměť a klíče.
Výhody pro middle/senior vývojáře:
- Skutečné koncové body místo mocků.
- Vlastní data bez nasazení.
- Rychlá validace HMAC + mezipaměť.
- Playground pro ladění.
- Docker architektura pro škálování.
Důležité:
- Samostatné klíče odstraní 99 % odpadu bez databáze.
- LRUCache s TTL=5min snižuje zatížení o více než 90 %.
- TimingSafeEqual chrání před timing-útoky.
- Dvoukrokové ověření: lokální + userId v DB.
- JSend odpovědi standardizují API.
— Editorial Team
Zatím žádné komentáře.