Přeskočit na hlavní obsah

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:

  1. Uživatel klikne na "Přihlásit se přes Google"
  2. Frontend přesměruje na GET /auth/google
  3. Server vygeneruje state token (CSRF ochrana)
  4. Server přesměruje na Google OAuth consent screen
  5. Uživatel autorizuje
  6. Google přesměruje na GET /auth/google/callback?code=...&state=...
  7. Server ověří state token
  8. Server vymění code za access token
  9. Server získá informace o uživateli z Google
  10. Server vytvoří/najde uživatele v databázi
  11. Server vygeneruje JWT token
  12. 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 Google
  • state - 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 heslo
  • INVALID_CREDENTIALS - Neplatný email nebo heslo
  • INVALID_PASSWORD - Současné heslo je nesprávné
  • VALIDATION_ERROR - Neplatný formát vstupu
  • BOOTSTRAP_DISABLED - Bootstrap endpoint je zakázán (admin již existuje)
  • INVALID_STATE - Neplatný nebo expirovaný OAuth state token
  • OAUTH_ERROR - Chyba OAuth poskytovatele
  • SMS_SEND_FAILED - Nepodařilo se odeslat SMS
  • INTERNAL_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