Přeskočit obsah

Autentizace

API podporuje dvě metody přihlášení. Nová metoda vrací JWT token, starý endpoint je označen jako obsolete.


POST /api/auth/login

Aktuální přihlašovací endpoint. Vrací JWT access token a refresh token.

Request

POST /api/auth/login
Content-Type: application/json
{
  "userId": "123",
  "pin": "1234"
}
Pole Typ Popis
userId string ID uživatele (číselné jako string)
pin string PIN uživatele (4–6 číslic)

Response 200 OK

{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "base64encodedRefreshToken==",
  "expiresIn": 28800,
  "user": {
    "id": 123,
    "userName": "jnovak",
    "fullName": "Jan Novák"
  }
}
Pole Typ Popis
accessToken string JWT Bearer token (platný expiresIn sekund)
refreshToken string Token pro obnovení přístupu
expiresIn int Platnost v sekundách (výchozí: 28 800 = 8 hodin)
user.id long ID uživatele
user.userName string Přihlašovací jméno
user.fullName string Celé jméno

Response 401 Unauthorized

{ "message": "Uživatel nenalezen." }
{ "message": "Účet není aktivní." }
{ "message": "Neplatné přihlašovací údaje." }

Použití tokenu

Přidejte Authorization header ke každému chráněnému požadavku:

GET /api/articles
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

JWT Claims

Token obsahuje tyto standardní claims:

Claim Zdroj Popis
sub (NameIdentifier) ApplicationUser.Id Identifikátor uživatele
name FirstName + " " + LastName Celé jméno
userName ApplicationUser.UserName Přihlašovací jméno
role ASP.NET Identity role Přiřazené role (Admin, Manager, User…)

Přístup k ID přihlášeného uživatele v controlleru:

// V controlleru dědicím z BaseApiController:
var userId = CurrentUserId; // string — hodnota sub claim

POST /api/login ⚠️ OBSOLETE

Starý endpoint zachovaný pro zpětnou kompatibilitu s mobilní aplikací. Pouze ověří PIN, nevrací token.

POST /api/login
Content-Type: application/json

{
  "userId": "123",
  "pin": "1234"
}

Nepoužívat pro nové integrace. Použijte /api/auth/login.


Konfigurace JWT

appsettings.json (Eva.Mobile.WebApi):

"Jwt": {
  "Issuer": "Eva.Mobile.WebApi",
  "Audience": "Eva.Mobile",
  "SecretKey": "<min. 32 znaků>",
  "TokenExpirationHours": 8
}

Produkce

SecretKey musí být nastaven přes proměnnou prostředí JWT_SECRET_KEY. Nikdy nedávejte produkční klíč do appsettings.json.


Ochrana vlastních endpointů

Nové controllery dědí z BaseApiController:

[ApiController]
[Route("api/[controller]")]
public class MyController : BaseApiController
{
    // CurrentUserId — ID přihlášeného uživatele z JWT claims
    // Automaticky vyžaduje platný JWT přes [Authorize]
}

Architektura

POST /api/auth/login
  └── AuthController.Login()
        ├── UserManager.FindByIdAsync()     — ověření userId
        ├── PasswordHasher.VerifyHash()     — ověření PIN
        └── JwtTokenService.GenerateTokensAsync()
              └── UserManager.GetRolesAsync() — přidá role do claims

Klíčové soubory:

Soubor Popis
Controllers/AuthController.cs Login endpoint
Controllers/BaseApiController.cs Abstraktní základ s [Authorize]
Services/JwtTokenService.cs Generování JWT a refresh tokenů
Controllers/LoginController.cs Starý endpoint (obsolete)