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.
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).
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.
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%.
timingSafeEqualchroni przed atakami czasowymi.- Dwuetapowa weryfikacja: lokalna + sprawdzenie userId w DB.
- Odpowiedzi JSend standardyzują API.
— Editorial Team
Brak komentarzy.