Co Váš e-shop veřejně zobrazuje
Modul 2: Instalace a nastavení · Doba čtení: 10 minut
Cíl lekce: Po této lekci dokážete vysvětlit, co jsou Store API a REST API WooCommerce, která data mají být veřejná a která ne, a jak bezpečně používat API klíče a webhooky.
Klíčové pojmy: API, REST API WordPressu, Store API (wc/store/v1), REST API WooCommerce (wc/v3), JSON, veřejné a chráněné, API klíč, práva ke čtení a zápisu, nejmenší potřebná práva, webhook, tajný klíč webhooku, X-WP-Total
Obchod se dvěma vchody
Návštěvník vidí Váš e-shop jako webové stránky. Váš e-shop má ale také „vchody“ pro programy: adresy, na kterých si program může vyžádat nebo odeslat data, bez vzhledu stránky. Takový vchod se nazývá API (application programming interface). WordPress má jedno pod /wp-json/, je to REST API. Kurz o WordPressu v lekci 7.3 ukázal, že si tam lze například vyžádat uživatelská jména, pokud nic neochráníte.
WooCommerce přidává dvě vlastní API s velmi odlišným účelem:
| Store API | REST API WooCommerce | |
|---|---|---|
| Adresa | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Pro koho | Prohlížeč návštěvníka (bloky košíku a pokladny, lekce 2.2) | Jiné programy: účetnictví, sklad, aplikace, propojení s tržištěm |
| Je potřeba klíč | Ne, veřejné | Ano, API klíč správce (nebo přihlášený uživatel s oprávněním) |
| Co obsahuje | Produkty, ceny, stav skladu, kategorie, hodnocení; košík a objednávku samotného návštěvníka | Vše: objednávky všech zákazníků, zákazníky, kupóny, nastavení, přehledy |
Store API je tedy vchod do výlohy: co je ve Vašem obchodě na stránce produktu, je v něm také, jen jako data. REST API WooCommerce jsou zadní dveře do skladu: ty mají být zamčené.
Store API: co si může vyžádat návštěvník (a kdokoli)
Otevřete v prohlížeči:
https://shop.example.com/wp-json/wc/store/v1/productsDostanete seznam ve formátu JSON, což je textový formát pro data. U každého produktu uvidíte mimo jiné název, slug, typ (jednoduchý, variabilní), adresu stránky produktu (permalink), SKU, ceny, obrázky, kategorie, zda je skladem a zda je na prodej. V hlavičkách odpovědi je X-WP-Total: počet produktů, které obchod zobrazuje návštěvníkům.
Několik věcí, které je dobré vědět:
- Ceny jsou v centech. Konvice na čaj za € 34,95 (≈ 852 Kč) je uvedena jako
"price": "3495"s"currency_minor_unit": 2. Vydělíte stem. Zda jde o cenu s DPH, nebo bez DPH, závisí na Vašem nastavení „Zobrazit ceny v obchodě“ (lekce 4.1). Tuto vlastnost využijeme v úkolu lekce 4.1. - Jen to, co je viditelné. Produkty, které jsou koncept, soukromé nebo skryté v katalogu, Store API nezapočítává. Proto může být
X-WP-Totalnižší než počet ve Vaší administraci. - Číst smí každý, zapisovat jen tak ne. Vložit něco do košíku nebo zaplatit přes Store API lze jen s jednorázovým kódem (nonce) ze stránky, a to jen pro vlastní košík daného návštěvníka.
Vadí, že je to veřejné? Ne: jsou to stejná data, jaká jsou na Vašich stránkách produktů. Konkurent, který chce sledovat Vaše ceny, to zvládne i s běžnými stránkami. Je ale dobré si uvědomit: vše, co zadáte do pole produktu, se může dostat do Store API. Nikdy nedávejte nákupní ceny, jména dodavatelů ani interní poznámky do krátkého nebo dlouhého popisu jen proto, že „šablona toto pole stejně nezobrazuje“.
Store API také nezavírejte. Bloky košíku a pokladny ho potřebují (lekce 2.2). Bezpečnostní pluginy, které „vypínají REST API pro návštěvníky“, proto někdy rozbijí placení. Chcete-li REST API omezit, Store API z toho vyjměte.
Zneužití Store API existuje, ale na straně zápisu: útočníci, kteří s ukradenými čísly karet zkoušejí tisíce malých objednávek. Říká se tomu card testing; tím se zabývá lekce 6.3.
REST API WooCommerce: vždy za klíčem
Nyní otevřete, aniž byste byli přihlášeni:
https://shop.example.com/wp-json/wc/v3/ordersSprávnou odpovědí je chybové hlášení se stavem 401 (nepřihlášen) a kódem jako woocommerce_rest_cannot_view. Váš e-shop říká: „toto nesmíte vidět“. Tak to má být. Pokud zde dostanete seznam objednávek, je něco vážně špatně: plugin, který otevírá oprávnění, upravený kód v šabloně, nebo klíč, který je ve veřejné adrese. Pak jde o možný únik dat (kurz o WordPressu, lekce 7.5, a znalostní báze 6749).
Programy, které potřebují přístup k Vašim objednávkám, dostanou API klíč. Vytvoříte ho v WooCommerce > Nastavení > Pokročilé > REST API (Advanced > REST API). Klíč se skládá ze dvou částí (consumer key a consumer secret) a patří k uživateli WordPressu. Zvolíte oprávnění:
- Číst: program smí data vyžadovat;
- Zapisovat: program smí data vytvářet a měnit;
- Číst/Zapisovat: obojí.
Pravidla, která dodržujte vždy:
- Nejmenší potřebná práva. Propojení s účetnictvím, které jen stahuje objednávky, dostane jen čtení. Propojení se skladem, které aktualizuje zásoby, potřebuje zápis, nástroj pro přehledy však ne.
- Jeden klíč na každé propojení, s jasným popisem („Účetnictví, jen čtení, 2026“). Když propojení skončí, zrušíte jen tento klíč.
- Přiřaďte klíč uživateli s odpovídajícími právy. Klíč správce zvládne vše, co správce. Raději vytvořte samostatného uživatele s rolí Manažer obchodu (lekce 6.2).
- Tajnou polovinu uložte bezpečně. Uvidíte ji jen jednou při vytvoření. Patří do nastavení programu nebo do správce hesel, ne do e-mailu, sdíleného dokumentu ani veřejného úložiště kódu.
- Dělejte pořádek. V REST API vidíte u každého klíče, kdy byl naposledy použit. Klíč, který se měsíce nepoužil, zrušte.
Webhooky: Váš e-shop volá jiný program
API čeká, až se někdo zeptá. Webhook funguje opačně: při události ve Vašem e-shopu (nová objednávka, změněný produkt) odešle WooCommerce samo zprávu na adresu, kterou zadáte. Váš program pro odesílání zásilek se tak hned dozví, že přišla objednávka, aniž by se musel každou minutu ptát. Nastavíte je v WooCommerce > Nastavení > Pokročilé > Webhooky.
Tři věci, na které dávejte pozor:
- Zpráva obsahuje osobní údaje. Webhook při nové objednávce posílá jméno, adresu a objednané produkty. Posílejte to jen na adresu přes https a jen subjektu, který je uveden ve Vašich zásadách ochrany osobních údajů a v záznamech o činnostech zpracování (lekce 5.5).
- Tajný klíč. U webhooku vyplníte tajný klíč. Přijímající program jím může ověřit, že zpráva skutečně pochází z Vašeho e-shopu, a ne od někoho, kdo adresu uhodl. Nenechávejte ho prázdný a sdílejte ho jen s příjemcem.
- Neúspěšné doručení. Pokud je přijímající adresa delší dobu nedostupná, může WooCommerce webhook po opakovaných chybách vypnout. Po výpadku se v části Webhooky podívejte, zda jsou stále aktivní.
Nezaměňujte to s webhookem Vašeho poskytovatele plateb (lekce 4.4). Ten funguje opačně: poskytovatel oznamuje Vašemu e-shopu, že platba proběhla.
V praxi: takto to vypadá ve WooCommerce
U jiných poskytovatelů hostingu to funguje stejně; jde o součásti samotného WooCommerce.
- V anonymním okně otevřete
/wp-json/wc/store/v1/productsna svém (testovacím) obchodě. Vyhledejte produkt a přepočítejte cenu. - Ve stejném anonymním okně otevřete
/wp-json/wc/v3/orders. Měli byste vidět stav 401. - Přejděte do WooCommerce > Nastavení > Pokročilé > REST API. Prohlédněte si, jaké klíče existují, u kterého uživatele a s jakými právy. Zrušte klíče, které neznáte (nebo už nepotřebujete).
- V části Webhooky zkontrolujte, jaké webhooky existují a na jakou adresu směřují.
- Máte-li bezpečnostní plugin, který omezuje REST API, ověřte, že je Store API vyjmuto.
Shrnutí
- Store API (
wc/store/v1) je veřejné a obsahuje to, co je i na Vašich stránkách produktů; bloky košíku a pokladny ho potřebují. - Nevkládejte do polí produktu interní údaje: přes Store API se mohou stát viditelnými.
- REST API WooCommerce (
wc/v3) má bez klíče vracet 401; seznam objednávek bez klíče je možný únik dat. - API klíče: nejmenší potřebná práva, jeden na propojení, u odpovídajícího uživatele, uchovávat v tajnosti, nepoužívané rušit.
- Webhooky posílají osobní údaje jinému programu: jen přes https, s tajným klíčem, subjektu ze záznamů o činnostech zpracování.
Kvíz
Úkol
Úkol A2.4: Co Váš e-shop veřejně zobrazuje? Zadejte adresu svého (testovacího) obchodu a počet produktů, které jsou ve Vašem obchodě viditelné. Program provede tři dotazy, bez cookies a bez klíče, pouze čtení:
/wp-json/wc/store/v1/products?per_page=1(Store API, přes adresu REST, kterou Váš web sám uvádí);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
V pořádku je: Store API odpoví stavem 200 a seznamem JSON; hlavička X-WP-Total se rovná počtu, který jste zadali; orders a customers vrátí 401, 403 nebo 404.
Oranžová: X-WP-Total se liší (produkty jako koncept, soukromé nebo skryté se nezapočítávají); Store API vrátí 401 nebo 403, většinou kvůli bezpečnostnímu pluginu, takže bloky pokladny nefungují.
Červená: Store API není dostupné, přestože na Vašem webu běží WooCommerce; nebo orders či customers vrátí seznam. To druhé je vážné: okamžitě to uzavřete, zkontrolujte své API klíče a pluginy a posuďte, zda musíte ohlásit únik dat. Program v takovém případě ukládá jen stavový kód, nikdy obsah.
Potom se sami podívejte do REST API a Webhooky: jaké klíče a webhooky tam jsou a víte u každého, k čemu slouží?
Další čtení
- Bezplatný kurz WordPress 7.3: Přihlašování: hesla, dvoufázové ověření a brute force
- Bezplatný kurz WordPress 7.5: Napadený web: jak ho poznat, obnovit a předcházet napadení
- WordPress: přístup k xmlrpc.php nefunguje
- Jedná se o únik dat a musím to nahlásit?
- Store API (developer.woocommerce.com, anglicky): https://developer.woocommerce.com/docs/apis/store-api/
- Omezení počtu požadavků (rate limiting) pro Store API (developer.woocommerce.com, anglicky): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
