Powrót do strony głównej

Klucze API dla pet-projektów: HMAC i cache

Platforma oferuje darmowe prawdziwe API dla pet-projektów z danymi użytkownika. Używa samowystarczalnych kluczy z HMAC, dwuetapowej walidacji i LRU-cache do ochrony przed przeciążeniem. Playground ułatwia testowanie bez wdrożenia.

Darmowy API bez zagłówek: klucze z podpisem HMAC
Advertisement 728x90

Bezpłatne API dla projektów pet: samodzielne klucze i ochrona przed przeciążeniem

Na rozmowach kwalifikacyjnych deweloperzy często pokazują aplikacje frontendowe z danymi z localStorage lub jsonplaceholder. To ułatwia tworzenie bez kosztów serwera, ale prowadzi do danych statycznych i symulacji opóźnień przez setTimeout. Alternatywa to platforma z rzeczywistym API, gdzie można przesyłać własne dane. Wdrożenie trwa kilka minut — backend nie jest potrzebny.

Architektura składa się z Next.js do interfejsu webowego z SSG, Node.js/Express do zarządzania użytkownikami i kluczami, oraz osobnego serwisu API. Wszystko uruchomione w Dockerze z proxy Nginx.

Problemy dostępu darmowego i rozwiązanie poprzez klucze API

Bez ograniczeń każdy użytkownik może generować spamowe żądania, co szybko zużywa zasoby. Kluczowy pomysł to minimalizacja zapytań do bazy danych i filtrowanie nieprawidłowych kluczy już na etapie parsowania.

Google AdInline article slot

Klucze są samodzielne — format: ppk_version_userId_nonce_signature. Autoryzacja: Authorization: PetProjects ppk_v1_1_nonce_signature.

Weryfikacja w dwóch krokach:

  • Lokalna walidacja: struktura i podpis HMAC bez bazy danych.
  • Sprawdzenie userId w bazie tylko dla ważnych kluczy.
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 chroni przed atakami czasowymi. Weryfikowane klucze są buforowane w LRUCache (max: 10 000, TTL: 5 minut).

Google AdInline article slot

Buforowanie i równowaga wydajności

Buforowanie zmniejsza opóźnienia i obciążenie bazy danych. TTL 5 minut to kompromis: przy utracie klucza działa on ograniczony czas, a następnie wymaga ponownej weryfikacji.

Ograniczenia:

  • Brak natychmiastowego odwołania kluczy.
  • Utrata klucza działa do momentu wygaśnięcia TTL.
  • Sekret wymaga ochrony.

Możliwe ulepszenia: czarna lista, wersjonowanie, odwoływanie kluczy.

Google AdInline article slot

Przestrzeń testowa do sprawdzania API

Interaktywny interfejs pozwala wysyłać zapytania bezpośrednio z przeglądarki z automatyczną podpowiedzią klucza. Generuje przykłady dla różnych języków programowania.

Przykład 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"}'

Odpowiedź w formacie JSend:

{
    "status": "success",
    "data": {
        "id": 99,
        "payload": {
            "hello": "world"
        },
        "createdAt": 1774297745939,
        "updatedAt": 1774297745939
    }
}

Skalowanie i planowane ulepszenia

System minimalizuje zapytania do bazy danych, chroni przed nadużyciami i balansuje bezpieczeństwo z szybkością. Przy wzroście obciążenia konieczne będzie monitorowanie bufora i kluczy.

Zalety dla deweloperów średnich i seniorów:

  • Rzeczywiste punkty końcowe zamiast mocków.
  • Własne dane bez deplojowania.
  • Szybka weryfikacja HMAC + buforowanie.
  • Przestrzeń testowa do debugowania.
  • Architektura Docker do skalowania.

Co najważniejsze:

  • Samodzielne klucze odrzucają 99% szumu bez bazy danych.
  • LRUCache z TTL=5min zmniejsza obciążenie o ponad 90%.
  • timingSafeEqual chroni przed atakami czasowymi.
  • Dwuetapowa weryfikacja: lokalna + sprawdzenie userId w DB.
  • Odpowiedzi JSend standardyzują API.

— Editorial Team

Advertisement 728x90

Czytaj dalej