Praktický návod

Jak zabezpečit API pomocí tokenů

Token nejdřív spolehlivě ověř, potom samostatně rozhodni, co jeho držitel smí udělat.

30 minut · API

Nejdřív stručně

Token není celé zabezpečení

Autentizace ověřuje, kdo požadavek posílá. Autorizace až potom rozhoduje, zda tento uživatel nebo systém smí zavolat konkrétní endpoint a pracovat s daným objektem.

JWT je jeden formát tokenu, ne automatická záruka bezpečnosti. API musí ověřit jeho podpis, vydavatele, příjemce i časovou platnost a celý přenos chránit pomocí HTTPS/TLS.

Připrav si

Co budeš potřebovat

Nejdřív si ujasni důvěryhodného vydavatele tokenů, jejich příjemce a požadovanou dobu platnosti.

  • Seznam klientů API, chráněných operací a rizik při odcizení tokenu.
  • Důvěryhodného poskytovatele identity nebo zavedenou knihovnu pro vydávání a ověřování tokenů. Nevytvářej vlastní kryptografii.
  • HTTPS ve všech prostředích, kde se přenášejí skutečné přihlašovací údaje nebo tokeny.
  • Místo pro bezpečné uložení klíčů a tajemství a plán rotace, revokace a řešení incidentu.

Kroky 1 až 3

Postav ochranu ve třech vrstvách

Formát tokenu, ověření identity a kontrola oprávnění jsou tři různá rozhodnutí.

1. Zvol formát a životní cyklus tokenu

  1. Pro interní API může být vhodný náhodný neprůhledný token uložený na serveru. JWT použij, když potřebuješ lokální ověření podepsaných claims bez dotazu na vydavatele.
  2. Access tokenům nastav krátkou expiraci, typicky v minutách. Dlouhá relace patří do samostatného, přísněji chráněného obnovovacího mechanismu.
  3. Do JWT dej jen nezbytné identifikátory a oprávnění, nikdy hesla ani tajemství. Definuj alespoň vydavatele, příjemce, subjekt, expiraci a jednoznačný identifikátor tokenu.
  4. Použij prověřenou knihovnu nebo poskytovatele identity. U asymetrických klíčů zveřejňuj jen veřejné klíče, používej identifikátor klíče a naplánuj jejich překryvnou rotaci.
composer require symfony/security-bundle
Oficiální Symfony dokumentace k access tokenům

2. Ověř token před spuštěním aplikační logiky

  1. Přijímej access token ve standardní hlavičce Authorization: Bearer. Nedávej ho do URL, kde může skončit v historii, analytice nebo logu.
  2. U JWT povol jen očekávané algoritmy a ověř podpis, issuer, audience, exp a případně nbf. Neber algoritmus ani adresu klíče nekontrolovaně z tokenu.
  3. Po úspěšném ověření převeď stabilní subject na interní identitu. Neexistující, zablokovaný nebo smazaný účet nesmí získat přístup jen díky dosud platnému tokenu.
  4. Neplatný nebo chybějící token vrať jako 401. Do logu ulož důvod a korelační ID, ale nikdy celý token ani citlivé claims.
RFC 6750: používání Bearer tokenů

3. Autorizuj každou chráněnou operaci

  1. Po autentizaci rozhodni podle oprávnění, role a konkrétního objektu. V Symfony dej jednoduchá pravidla do access_control a doménová rozhodnutí do voterů.
  2. Výchozí stav má být zákaz. Nový endpoint se nesmí stát veřejným jen proto, že k němu zatím nikdo nepřidal pravidlo.
  3. Ověřuj i vlastnictví a tenant. Role EDITOR sama o sobě nesmí umožnit upravit cizí objednávku nebo data jiné organizace.
  4. Platnou identitu bez potřebného oprávnění odmítni stavem 403. Klient tak rozliší neplatnou identitu od nedostatečných práv.
php bin/console debug:firewall
Oficiální Symfony dokumentace k voterům

Krok 4

Otestuj hranice přístupu

Úspěšný požadavek nestačí. Každé pravidlo musí mít i negativní test.

  1. Zavolej endpoint bez tokenu

    Chráněný endpoint má vrátit 401 a nesmí spustit aplikační operaci.

    curl -i https://api.example.test/api/orders/42
  2. Pošli poškozený nebo expirovaný token

    API jej musí odmítnout bez ohledu na role uvedené uvnitř neověřeného tokenu.

    curl -i https://api.example.test/api/orders/42 -H 'Authorization: Bearer invalid-token'
  3. Ověř nedostatečné oprávnění

    Platný token uživatele bez práva k objektu má dostat 403. Stejný test proveď pro jiného tenanta.

    curl -i -X DELETE https://api.example.test/api/orders/42 -H 'Authorization: Bearer ACCESS_TOKEN'

Když to zlobí

Nejčastější chyby

Platný token vrací 401

Zkontroluj issuer, audience, použitý klíč a čas serveru. Malou toleranci odchylky nastav explicitně, ale neprodlužuj jí zbytečně platnost tokenu.

date -u
Uživatel je přihlášený, ale operace vrací 403

Autentizace proběhla správně. Hledej chybějící oprávnění, pravidlo access_control, voter nebo kontrolu vlastnictví objektu.

php bin/console debug:firewall
Odhlášený uživatel může JWT ještě použít

Podepsané JWT je bez dalšího stavu platné až do expirace. Použij krátkou životnost a při nutnosti okamžitého odvolání kontroluj revokační seznam podle jti nebo stav účtu.

Token se objevil v logu nebo úložišti klienta

Token okamžitě revokuj, otoč dotčená tajemství a odstraň logování hlavičky Authorization. V prohlížeči zvaž HttpOnly, Secure a SameSite cookie s odpovídající CSRF ochranou; na serveru použij správce tajemství a v mobilu systémové bezpečné úložiště.

Hotovo

API rozlišuje identitu i oprávnění.

Autorizace teď navazuje na ověřenou identitu a chrání každou operaci samostatně. Pravidelně testuj expiraci, rotaci klíčů, revokaci i přístup k cizím objektům.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.