API — autoryzacja
API operatora używa opaque bearer tokenów. Token ma wysoką entropię, datę ważności i zapisany w bazie wyłącznie skrót.
Logowanie
curl https://splotweselny.pl/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{
"email": "operator@example.com",
"password": "REPLACE_WITH_SECRET",
"device_name": "iPhone coordinator"
}'
Odpowiedź 200:
{
"token": "RAW_TOKEN_SHOWN_ONCE",
"expires_at": "2026-08-29T08:00:00+00:00",
"user": {
"id": "00000000-0000-0000-0000-000000000000",
"email": "operator@example.com",
"display_name": "Operator"
}
}
Nie loguj tokenu i nie zapisuj go w UserDefaults, localStorage ani kodzie źródłowym.
Autoryzowane żądanie
curl https://splotweselny.pl/api/v1/auth/me \
-H 'Authorization: Bearer RAW_TOKEN'
Profil zawiera użytkownika, organizację, rolę i listę obiektów.
Web
Przeglądarka nie wywołuje API tokenem z kodu klienckiego. Akcja logowania Next.js zapisuje token w bezpiecznym cookie HttpOnly; komponenty i akcje serwerowe przekazują go do wewnętrznego API.
iOS
Aplikacja zapisuje token w Keychain. Po odpowiedzi 401 powinna zakończyć sesję albo poprosić o ponowne logowanie, bez nieskończonej pętli ponowień.
Wylogowanie
curl -X POST https://splotweselny.pl/api/v1/auth/logout \
-H 'Authorization: Bearer RAW_TOKEN'
Odpowiedź 204 oznacza usunięcie bieżącego tokenu. Wylogowanie jednego urządzenia nie usuwa innych aktywnych tokenów użytkownika.
Ograniczenie prób
Nieudane próby są śledzone dla zahashowanej pary e-mail + adres klienta. Po przekroczeniu limitu logowanie zwraca 429 przez skonfigurowane okno blokady.