DBM API – Endpointy i Autoryzacja

Dokumentacja jest stale rozwijana i aktualizowana wraz z postępem projektu. Ponieważ powstaje ona równolegle z kodem, niektóre sekcje mogą tymczasowo odnosić się do wcześniejszych wersji systemu - są one sukcesywnie dostosowywane do bieżącego stanu aplikacji. Jeśli zauważysz nieaktualne informacje, zgłoś to lub załóż Issue / Pull Request.

Dokumentacja

# DBM API – Endpointy i Autoryzacja

# Base URL /api

https://example.com/api lub https://api.example.com/


# Autoryzacja (JWT)

API wykorzystuje autoryzację typu Bearer Token.

Authorization: Bearer {token}


# Konfiguracja JWT (.env)

API_JWT_SECRET=your-secret-key
API_JWT_EXPIRATION=3600

# Struktura JWT (Payload)

Przykładowy payload:

{
  "sub": "user_id",
  "iat": 1710000000,
  "exp": 1710003600
}
PoleOpis
subIdentyfikator użytkownika
iatCzas wygenerowania tokena
expCzas wygaśnięcia tokena

# Generowanie JWT (PHP)

Prosta implementacja bez zewnętrznych bibliotek:

function base64UrlEncode(string $data): string
{
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function generateJwt(string $userId): string
{
    $secret = getenv('API_JWT_SECRET');
    $expiration = (int) getenv('API_JWT_EXPIRATION') ?: 3600;

    $header = [
        'alg' => 'HS256',
        'typ' => 'JWT'
    ];

    $payload = [
        'sub' => $userId,
        'iat' => time(),
        'exp' => time() + $expiration
    ];

    $base64Header = base64UrlEncode(json_encode($header));
    $base64Payload = base64UrlEncode(json_encode($payload));

    $signature = hash_hmac(
        'sha256',
        $base64Header . "." . $base64Payload,
        $secret,
        true
    );

    $base64Signature = base64UrlEncode($signature);

    return $base64Header . '.' . $base64Payload . '.' . $base64Signature;
}

# Walidacja JWT (Przykład)

function validateJwt(string $jwt): bool
{
    $secret = getenv('API_JWT_SECRET');

    [$header, $payload, $signature] = explode('.', $jwt);

    $validSignature = base64UrlEncode(
        hash_hmac('sha256', "$header.$payload", $secret, true)
    );

    if (!hash_equals($validSignature, $signature)) {
        return false;
    }

    $payloadData = json_decode(base64_decode($payload), true);

    if ($payloadData['exp'] < time()) {
        return false;
    }

    return true;
}

# Endpointy REST API

# Health Check

# GET /health

Sprawdza czy API działa.

Response:

{
  "status": "ok"
}

# Autoryzacja

# POST /auth/token

Generuje token JWT.

Request:

{
  "user_id": "123"
}

Response:

{
  "token": "jwt-token"
}

# Użytkownicy

# GET /users

Pobiera listę użytkowników.

[
  {
    "id": 1,
    "name": "John Doe"
  }
]

# GET /users/{id}

Pobiera pojedynczego użytkownika.

# POST /users

Tworzy użytkownika.

{
  "name": "John Doe",
  "email": "john@example.com"
}

# PUT /users/{id}

Aktualizuje użytkownika.

# DELETE /users/{id}

Usuwa użytkownika.

# Zamówienia

# GET /orders

Lista zamówień.

# POST /orders

Tworzy zamówienie.

{
  "product_id": 1,
  "quantity": 2
}

# GET /orders/{id}

Szczegóły zamówienia.

# DELETE /orders/{id}

Usuwa zamówienie.

# Błędy

# Standardowy format

{
  "error": true,
  "message": "Opis błędu"
}

# Najczęstsze kody HTTP

KodZnaczenie
200OK
201Utworzono
400Błędne żądanie
401Brak autoryzacji
403Zabronione
404Nie znaleziono
500Błąd serwera

# Przykład użycia

$client = ApiFactory::create('https://example.com/api', generateJwt('123'));

$response = $client->get('/users');

$data = json_decode($response->getBody(), true);

# Uwagi

  • Zawsze waliduj JWT na chronionych endpointach
  • Przechowuj API_JWT_SECRET w bezpiecznym miejscu
  • Używaj HTTPS w środowisku produkcyjnym
  • Zalecany krótki czas życia tokena (np. 1 godzina)