Zpět na domů

API klíče pro pet-projekty: HMAC a cache

Platforma poskytuje bezplatné skutečné API pro pet-projekty s uživatelskými daty. Používá soběstačné klíče s HMAC, dvoustupňovou validaci a LRU cache pro ochranu před přetížením. Playground usnadňuje testování bez nasazení.

Bezplatné API bez zástěpek: klíče s HMAC podpisem
Advertisement 728x90

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í.

Google AdInline article slot

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).

Google AdInline article slot

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íčů.

Google AdInline article slot

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

Advertisement 728x90

Číst dál