Autentizační API
API reference pro autentizační endpointy v systému D'n'A Cruises.
Přehled
Autentizační API podporuje více metod autentizace:
- Email + heslo
- Google OAuth
- Passkeys (WebAuthn)
- Dvoufaktorová autentizace (2FA) - TOTP nebo SMS
Všechny metody nakonec generují JWT token pro následné API požadavky.
Endpointy
POST /auth/bootstrap
Vytvoří počátečního admin uživatele. Funguje pouze pokud žádný admin neexistuje.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"email": "[email protected]",
"password": "SecurePassword123!",
"name": "Admin User"
}
Response:
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "[email protected]",
"name": "Admin User",
"role": "Admin"
}
}
}
Error Response (admin již existuje):
{
"success": false,
"error": "BOOTSTRAP_DISABLED",
"message": "Bootstrap is disabled. Admin user already exists."
}
Rate Limit: 20 požadavků za minutu na IP
POST /auth/login
Přihlášení pomocí emailu a hesla.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"email": "[email protected]",
"password": "UserPassword123!"
}
Response (bez 2FA):
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "[email protected]",
"role": "Loader"
}
}
}
Response (2FA vyžadováno):
{
"success": true,
"requires2FA": true,
"session_token": "temp-session-token-here",
"method": "TOTP",
"message": "Zadejte TOTP kód z autentizační aplikace. Zavolejte /auth/2fa/verify s kódem a session_token"
}
Error Response:
{
"success": false,
"error": "INVALID_CREDENTIALS",
"message": "Invalid email or password"
}
Rate Limit: 20 požadavků za minutu na IP
POST /auth/logout
Odhlášení - zneplatní všechny sessiony pro uživatele.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request: Žádný
Response:
{
"success": true,
"data": {
"message": "Logged out successfully"
}
}
GET /auth/me
Získá informace o aktuálním uživateli.
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": {
"id": 1,
"email": "[email protected]",
"name": "User Name",
"role": "Loader",
"two_factor_enabled": true,
"two_factor_method": "TOTP"
}
}
POST /auth/password
Změna hesla pro aktuálního uživatele.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"current_password": "OldPassword123!",
"new_password": "NewPassword123!"
}
Response:
{
"success": true,
"data": {
"message": "Password changed successfully"
}
}
Error Response:
{
"success": false,
"error": "INVALID_PASSWORD",
"message": "Current password is incorrect"
}
OAuth tok
GET /auth/google
Zahájí Google OAuth flow.
Oprávnění: Žádné (veřejný endpoint)
Response: Přesměruje na Google OAuth consent screen
Flow:
- Uživatel klikne na "Přihlásit se přes Google"
- Frontend přesměruje na
GET /auth/google - Server vygeneruje state token (CSRF ochrana)
- Server přesměruje na Google OAuth consent screen
- Uživatel autorizuje
- Google přesměruje na
GET /auth/google/callback?code=...&state=... - Server ověří state token
- Server vymění code za access token
- Server získá informace o uživateli z Google
- Server vytvoří/najde uživatele v databázi
- Server vygeneruje JWT token
- Server přesměruje na frontend s tokenem v URL
GET /auth/google/callback
OAuth callback handler.
Oprávnění: Žádné (veřejný endpoint)
Query parametry:
code- Autorizační kód z Googlestate- State token pro CSRF ochranu
Response: Přesměruje na frontend s JWT tokenem v URL
Error Response:
{
"success": false,
"error": "INVALID_STATE",
"message": "Invalid or expired state"
}
2FA tok
POST /auth/2fa/setup
Nastavení 2FA (TOTP nebo SMS).
Oprávnění: Bearer token (vyžaduje autentizaci)
Request (TOTP):
{
"method": "TOTP"
}
Request (SMS):
{
"method": "SMS",
"phone_number": "+420123456789"
}
Response (TOTP):
{
"success": true,
"data": {
"secret": "JBSWY3DPEHPK3PXP",
"qr_code_url": "otpauth://totp/DnA%20Cruises:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=DnA%20Cruises"
}
}
Response (SMS):
{
"success": true,
"data": {
"message": "SMS code sent to +420123456789"
}
}
POST /auth/2fa/enable
Aktivace 2FA po nastavení.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"code": "123456"
}
Response:
{
"success": true,
"data": {
"message": "2FA enabled successfully"
}
}
POST /auth/2fa/verify
Ověření 2FA kódu během přihlášení.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"code": "123456",
"session_token": "temp-session-token-from-login"
}
Response:
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "[email protected]",
"role": "Loader"
}
}
}
POST /auth/2fa/disable
Deaktivace 2FA.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"password": "UserPassword123!"
}
Response:
{
"success": true,
"data": {
"message": "2FA disabled successfully"
}
}
POST /auth/2fa/resend
Opětovné odeslání SMS kódu.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"session_token": "temp-session-token"
}
Response:
{
"success": true,
"data": {
"message": "SMS code resent"
}
}
Passkeys (WebAuthn)
POST /auth/passkey/register/start
Zahájení registrace passkey.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"name": "My Passkey"
}
Response:
{
"success": true,
"data": {
"challenge": "base64url-encoded-challenge",
"rp": {
"name": "D'n'A Cruises",
"id": "dna.cruises"
},
"user": {
"id": "base64url-user-id",
"name": "[email protected]",
"displayName": "User Name"
},
"pubKeyCredParams": [
{
"type": "public-key",
"alg": -7
}
],
"authenticatorSelection": {
"userVerification": "preferred"
},
"timeout": 60000
}
}
POST /auth/passkey/register/finish
Dokončení registrace passkey.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"challenge": "base64url-challenge",
"credential": {
"id": "base64url-credential-id",
"rawId": "base64url-raw-id",
"response": {
"attestationObject": "base64url-attestation-object",
"clientDataJSON": "base64url-client-data"
},
"type": "public-key"
}
}
Response:
{
"success": true,
"data": {
"message": "Passkey registered successfully",
"passkey": {
"id": 1,
"name": "My Passkey"
}
}
}
POST /auth/passkey/login/start
Zahájení přihlášení pomocí passkey.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"email": "[email protected]"
}
Response:
{
"success": true,
"data": {
"challenge": "base64url-challenge",
"allowCredentials": [
{
"id": "base64url-credential-id",
"type": "public-key"
}
],
"timeout": 60000
}
}
POST /auth/passkey/login/finish
Dokončení přihlášení pomocí passkey.
Oprávnění: Žádné (veřejný endpoint)
Request:
{
"challenge": "base64url-challenge",
"credential": {
"id": "base64url-credential-id",
"rawId": "base64url-raw-id",
"response": {
"authenticatorData": "base64url-authenticator-data",
"clientDataJSON": "base64url-client-data",
"signature": "base64url-signature"
},
"type": "public-key"
}
}
Response:
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "[email protected]",
"role": "Loader"
}
}
}
GET /auth/passkeys
Seznam passkeys uživatele.
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": [
{
"id": 1,
"name": "My Passkey",
"created_at": 1704067200,
"last_used_at": 1704153600
}
]
}
PUT /auth/passkeys/:id
Přejmenování passkey.
Oprávnění: Bearer token (vyžaduje autentizaci)
Request:
{
"name": "Renamed Passkey"
}
Response:
{
"success": true,
"data": {
"message": "Passkey renamed"
}
}
DELETE /auth/passkeys/:id
Smazání passkey.
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": {
"message": "Passkey deleted"
}
}
Kódy chyb
MISSING_CREDENTIALS- Chybí email nebo hesloINVALID_CREDENTIALS- Neplatný email nebo hesloINVALID_PASSWORD- Současné heslo je nesprávnéVALIDATION_ERROR- Neplatný formát vstupuBOOTSTRAP_DISABLED- Bootstrap endpoint je zakázán (admin již existuje)INVALID_STATE- Neplatný nebo expirovaný OAuth state tokenOAUTH_ERROR- Chyba OAuth poskytovateleSMS_SEND_FAILED- Nepodařilo se odeslat SMSINTERNAL_ERROR- Chyba serveru
Omezení rychlosti
- Veřejné endpointy (login, bootstrap): 20 požadavků za minutu na IP
- Autentizované endpointy: 2000 požadavků za minutu na uživatele
Související témata
- Autentizační průvodce - Technické detaily implementace
- Uživatelský průvodce - Autentizace - Uživatelsky orientovaný průvodce