API testy

Autentizace v API testech: klíče, tokeny, OAuth a expirace

První API test často funguje s tokenem ručně zkopírovaným z prohlížeče. Za hodinu vyprší, v CI není uživatelská relace a celá automatizace se zastaví ještě před první obchodní kontrolou. Autentizace proto nemůže zůstat jednorázovým setupem „nějak získej token“. Je samostatnou testovanou schopností s vlastními scénáři, tajemstvími a životním cyklem.

Tento článek se věnuje čistě API pohledu: jak klient prokáže identitu, jaká oprávnění credential nese a co se děje při expiraci či rotaci. Uživatelské obrazovky, přesměrování a chování formuláře rozebírá samostatně článek o testování přihlášení, 2FA a OAuth v UI.

Nejprve odlište autentizaci od autorizace

Autentizace odpovídá na otázku, kdo nebo co volá API. Autorizace rozhoduje, co tento klient smí udělat. Platný token proto ještě neznamená přístup ke každému endpointu.

Test musí umět rozlišit alespoň tyto stavy:

Podle HTTP Semantics v RFC 9110 odpověď 401 Unauthorized vyžaduje autentizační údaje a obsahuje výzvu WWW-Authenticate; 403 Forbidden znamená, že server požadavku rozuměl, ale odmítá jej splnit. Konkrétní API smlouva může záměrně skrýt existenci zdroje nebo omezit detail chyby, proto testujte dohodnuté chování, ne univerzální představu o každém systému.

Zmapujte všechny způsoby získání přístupu

Jedno API může současně používat více mechanismů:

Pro každý mechanismus vytvořte matici: kdo credential vydává, komu je určen, kde se posílá, jakou má platnost, scopes, způsob obnovy, rotace a odvolání. Bez této mapy vzniknou testy, které používají administrátorský token na všechno a neprověří skutečné hranice oprávnění.

OAuth je rámec autorizace, ne jeden konkrétní typ přihlašování. RFC 6749 definuje role, access tokeny, scopes, expiraci a refresh tokeny. Aktuální bezpečnostní doporučení doplňuje OAuth 2.0 Security Best Current Practice, RFC 9700. Testovací návrh má vycházet z flow, který používá daný klient, ne z jednoho univerzálního skriptu.

Matici uložte společně s verzí API a konfigurací testovacího prostředí. Při změně issueru, audience nebo povoleného flow tak uvidíte, které scénáře je nutné upravit a která očekávání se nesmějí potichu změnit.

API klíče testujte jako identitu s životním cyklem

API klíč bývá jednodušší než OAuth token, ale není jen náhodný řetězec v hlavičce. Může identifikovat aplikaci, zákazníka nebo prostředí a nést limity či povolený rozsah operací.

Základní sada scénářů zahrnuje:

Klíč neposílejte v URL, pokud smlouva podporuje bezpečnější hlavičku. URL se může dostat do historie, proxy logů a analytiky. V testovacím kódu má být název tajemství, ne hodnota. Credential se vloží z chráněného úložiště konkrétního prostředí až při spuštění.

Rotaci je třeba otestovat bez poškození ostatních uživatelů testovacího prostředí. Nevypínejte sdílený klíč, který používá jiný tým. Bezpečnější je samostatný testovací klient nebo řízené administrační API s izolovaným rozsahem.

Bearer token není jen delší API klíč

Bearer token může použít kdokoli, kdo jej získá; samotné držení opravňuje k volání. RFC 6750 popisuje jeho použití v HTTP a bezpečnostní hrozby. Testovací logy, screenshoty a reporty proto nesmějí ukládat celou hodnotu tokenu.

U JWT bývá užitečné kontrolovat claims, ale test nemá tokenu věřit jen proto, že jej umí dekódovat. Dekódování Base64 není ověření podpisu. API má ověřit podpis a přijatelný algoritmus, issuer, audience, časové claims a podle smlouvy také scope či další omezení.

Negativní scénáře mohou použít token s:

Takové tokeny vytvářejte pouze v testovacím identity provideru nebo pomocí testovacích klíčů. Soukromý podpisový klíč produkčního poskytovatele nemá být testovací sadě dostupný.

Expirace musí být test, ne občasný incident

Nejčastější chybou automatizace je token získaný jednou na začátku a sdílený všemi testy bez ohledu na platnost. Krátký lokální běh projde, paralelní nebo hodinová sada začne náhodně vracet 401.

Testovací klient má znát čas expirace a používat bezpečnou rezervu. Pokud token vyprší za 30 sekund, nemá s ním začínat dlouhou operaci. Zároveň se nesmí spoléhat pouze na lokální hodiny; mezi klientem a serverem může být malý clock skew, který smlouva řeší tolerancí.

Prověřujte minimálně:

  1. volání těsně před dohodnutou expirací;
  2. volání po expiraci bez obnovy;
  3. automatické získání nového tokenu a opakování pouze bezpečné operace;
  4. chování po odvolání stále časově platného tokenu, pokud systém podporuje revokaci;
  5. dlouhý běh, během kterého token přirozeně expiruje;
  6. paralelní požadavky, které současně zjistí potřebu obnovy.

Poslední bod často vytvoří refresh storm: dvacet workerů současně požádá o nový token. Pomáhá uzamčení obnovy a sdílená cache v rámci procesu, aby token obnovil jeden worker a ostatní použili nový výsledek. Cache ale musí být oddělena podle identity, audience a scope; jinak test omylem použije oprávnění jiného scénáře.

Refresh token potřebuje vlastní negativní scénáře

Refresh token má obvykle jinou citlivost a životnost než access token. API nebo autorizační server může při každé obnově vydat nový refresh token a předchozí zneplatnit. Test musí novou hodnotu uložit atomicky, jinak paralelní proces přepíše aktuální token starým.

Ověřte:

Neopakujte automaticky každý obchodní požadavek po 401. U ne-idempotentní operace, například vytvoření platby, mohl server operaci provést a jen odpověď se ztratila. Klient potřebuje idempotency key nebo následné ověření stavu, ne slepý retry.

OAuth flow testujte odděleně od obchodního API

Když test selže při získání tokenu, ještě nic neřekl o objednávce. Rozdělte proto vrstvy:

Pro komunikaci služba–služba test client credentials nepoužívá uživatelské jméno a heslo. Pro veřejné aplikace se při authorization code flow používá PKCE podle návrhu systému. Staré návody s Resource Owner Password Credentials grantem nekopírujte do nové automatizace; RFC 9700 stanoví, že se tento grant nesmí používat.

Test token endpointu má zkontrolovat status, strukturu odpovědi, typ tokenu, dobu platnosti a povolené scopes bez zapisování hodnot do reportu. V produkci se aktivní negativní pokusy omezují podle bezpečnostní dohody; většina takových scénářů patří do izolovaného prostředí.

Scopes, role a vlastnictví dat tvoří matici

Jeden administrátorský token vytváří pohodlné, ale slabé testy. Každý důležitý endpoint potřebuje alespoň povolenou a zakázanou identitu. U objektové autorizace nestačí „běžný uživatel“: uživatel A má číst vlastní objednávku, ne objednávku uživatele B.

Praktická matice obsahuje řádky endpointů a sloupce identit nebo oprávnění. Pro každý průnik určí očekávané čtení, zápis a případné maskování polí. Zmenšená riziková matice je lepší než kombinatorické spuštění všech rolí nad vším.

U chybové odpovědi nekontrolujte pouze status. Ověřte, že nevydává citlivý detail, neprozrazuje existenci cizího zdroje nad rámec smlouvy a nezmění data. Autorizace musí platit také u hromadných endpointů, exportů a vnořených zdrojů, ne jen u jednoho GET /orders/{id}.

Mock identity provider nebo reálná služba

Mock poskytuje rychlé a deterministické scénáře: expiraci lze posunout bez čekání, vytvořit libovolný scope a simulovat chybu. Neověří však skutečné TLS, konfiguraci klienta, podporovaný flow, rotaci klíčů ani chování externího poskytovatele.

Užitečná je proto kombinace. Většina obchodních testů používá rychlý testovací issuer nebo připravené tokeny s kontrolovanými claims. Menší integrační sada pravidelně získává token od skutečně nakonfigurovaného poskytovatele v neprodukčním tenantu. Rozdíl mezi mockem, sandboxem a reálnou integrací popisuje článek mock, sandbox nebo reálná služba.

Tajemství a reporty jsou součástí testu

Client secret, API klíč a refresh token nepatří do repozitáře, testovacích dat ani parametru příkazového řádku viditelného v seznamu procesů. CI má číst tajemství z chráněného úložiště, omezit je na potřebné prostředí a maskovat výstup.

Maskování přesné hodnoty nestačí, pokud log vypíše celou hlavičku Authorization, URL s klíčem nebo JSON odpověď token endpointu. Před uložením logu je bezpečnější allowlist povolených hlaviček a polí než nekonečný seznam zakázaných názvů. Pro diagnostiku stačí hash nebo poslední čtyři znaky identifikátoru, issuer, audience, scope a čas expirace — ne credential.

Testovací účty mají mít minimální oprávnění, jasného vlastníka, automatizovanou rotaci a bezpečný způsob obnovy. Sdílený účet „admin test“ snižuje schopnost odhalit chyby autorizace a komplikuje audit.

Co spolehlivá autentizační vrstva přinese

Obchodní testy přestanou náhodně padat na expirovaném tokenu a zároveň nebudou ignorovat bezpečnostní hranice. Tým dokáže samostatně zjistit, zda selhal identity provider, získání credentialu, scope nebo samotná funkce API. Rotaci klíče lze nacvičit před produkční změnou a report poskytne diagnostiku bez úniku tajemství.

Autentizace je ale pouze jedna vrstva. Statusy, schéma, idempotence, chybové stavy a obchodní pravidla patří do širší strategie co testovat v API.

Další krok

Sepište pro jedno API matici identity, credentialu, scope, expirace a způsobu obnovy. Vytvořte centrálního testovacího klienta, který token bezpečně získá, cacheuje s rezervou a rediguje logy. Potom přidejte tři první negativní scénáře: chybějící credential, platná identita bez oprávnění a expirovaný token. Oddělíte tak chyby přístupu od chyb obchodní funkce a připravíte sadu na dlouhé i paralelní běhy.

Související témata

Mohlo by vás také zajímat

Chyby v obchodní logice odhalíte rychleji přímo přes API

Funkční, integrační a kontraktní testování REST, SOAP či GraphQL rozhraní s možností zapojení do CI/CD pipeline.