Co Państwa sklep pokazuje publicznie
Moduł 2: Instalacja i konfiguracja · Czas czytania: 10 min
Cel lekcji: Po tej lekcji będą Państwo potrafili wyjaśnić, czym są Store API i REST API WooCommerce, które dane powinny być publiczne, a które nie, oraz jak bezpiecznie korzystać z kluczy API i webhooków.
Kluczowe pojęcia: API, REST API WordPressa, Store API (wc/store/v1), REST API WooCommerce (wc/v3), JSON, dane publiczne i chronione, klucz API, uprawnienia do odczytu i zapisu, zasada minimalnych uprawnień, webhook, tajny klucz webhooka, X-WP-Total
Sklep z dwojgiem drzwi
Odwiedzający widzi Państwa sklep jako strony internetowe. Sklep ma jednak także „drzwi” dla programów: adresy, pod którymi program może pobierać lub wysyłać dane, bez wyglądu strony. Takie drzwi nazywa się API (application programming interface). WordPress ma takie API pod adresem /wp-json/, jest to REST API. Kurs WordPress pokazał w lekcji 7.3, że jeśli niczego się nie zabezpieczy, można tam na przykład pobrać nazwy użytkowników.
WooCommerce dodaje dwa własne API o zupełnie różnym przeznaczeniu:
| Store API | REST API WooCommerce | |
|---|---|---|
| Adres | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Dla kogo | Przeglądarka odwiedzającego (bloki koszyka i zamówienia, lekcja 2.2) | Inne programy: księgowość, magazyn, aplikacja, integracja z platformą sprzedażową |
| Czy potrzebny klucz | Nie, jest publiczne | Tak, klucz API administratora (lub zalogowany użytkownik z uprawnieniami) |
| Co zawiera | Produkty, ceny, stan magazynowy, kategorie, opinie; koszyk i zamówienie samego odwiedzającego | Wszystko: zamówienia wszystkich klientów, klientów, kupony, ustawienia, raporty |
Store API to zatem wejście od strony witryny sklepowej: to, co widać w sklepie na stronie produktu, jest w nim również, tylko w postaci danych. REST API WooCommerce to tylne drzwi do magazynu: muszą być zamknięte na klucz.
Store API: co może pobrać odwiedzający (i każdy inny)
Prosimy otworzyć w przeglądarce:
https://shop.example.com/wp-json/wc/store/v1/productsOtrzymają Państwo listę w formacie JSON, czyli tekstowym formacie danych. Dla każdego produktu widać między innymi nazwę, slug, typ (prosty, z wariantami), adres strony produktu (permalink), SKU, ceny, zdjęcia, kategorie, informację, czy jest dostępny w magazynie i czy można go kupić. W nagłówkach odpowiedzi znajduje się X-WP-Total: liczba produktów, które sklep pokazuje odwiedzającym.
Kilka rzeczy, o których warto wiedzieć:
- Ceny są podawane w centach. Dzbanek do herbaty za € 34,95 (≈ 153,52 zł) występuje jako
"price": "3495"z"currency_minor_unit": 2. Należy podzielić przez 100. Czy jest to cena z VAT, czy bez, zależy od ustawienia „Wyświetlaj ceny w sklepie” (lekcja 4.1). Z tej właściwości korzystamy w zadaniu z lekcji 4.1. - Tylko to, co widoczne. Produktów zapisanych jako szkic, prywatnych lub ukrytych w katalogu Store API nie uwzględnia. Dlatego
X-WP-Totalmoże być niższe niż liczba produktów w panelu administracyjnym. - Odczyt jest dostępny dla wszystkich, zapis nie bez ograniczeń. Dodanie czegoś do koszyka lub złożenie zamówienia przez Store API jest możliwe tylko z jednorazowym kodem (nonce) ze strony i wyłącznie dla własnego koszyka danego odwiedzającego.
Czy to problem, że te dane są publiczne? Nie: są to te same dane, które widnieją na stronach produktów. Konkurent, który chce śledzić Państwa ceny, może to robić także za pomocą zwykłych stron. Warto jednak pamiętać: wszystko, co wpiszą Państwo w pole produktu, może trafić do Store API. Prosimy nigdy nie umieszczać cen zakupu, nazw dostawców ani notatek wewnętrznych w krótkim lub długim opisie „bo motyw i tak nie wyświetla tego pola”.
Prosimy też nie blokować Store API. Bloki koszyka i zamówienia go potrzebują (lekcja 2.2). Wtyczki bezpieczeństwa, które „wyłączają REST API dla odwiedzających”, czasem z tego powodu psują składanie zamówień. Jeśli chcą Państwo ograniczyć REST API, prosimy wyłączyć Store API spod tego ograniczenia.
Nadużycia Store API się zdarzają, ale po stronie zapisu: atakujący próbują złożyć tysiące drobnych zamówień skradzionymi numerami kart. Nazywa się to card testing; zajmuje się tym lekcja 6.3.
REST API WooCommerce: zawsze zabezpieczone kluczem
Prosimy teraz otworzyć, bez logowania:
https://shop.example.com/wp-json/wc/v3/ordersPrawidłowa odpowiedź to komunikat o błędzie ze statusem 401 (niezalogowany) i kodem w rodzaju woocommerce_rest_cannot_view. Sklep mówi: „nie mają Państwo dostępu do tych danych”. Tak właśnie powinno być. Jeśli w tym miejscu pojawi się lista zamówień, oznacza to poważny problem: wtyczka, która otwiera uprawnienia, zmodyfikowany kod w motywie albo klucz umieszczony w publicznym adresie. Wtedy mogło dojść do naruszenia ochrony danych (kurs WordPress, lekcja 7.5, oraz baza wiedzy 6749).
Programy, które potrzebują dostępu do zamówień, otrzymują klucz API. Tworzy się go w WooCommerce > Ustawienia > Zaawansowane > REST API (Advanced > REST API). Klucz składa się z dwóch części (consumer key i consumer secret) i jest przypisany do użytkownika WordPressa. Wybierają Państwo uprawnienia:
- Odczyt: program może pobierać dane;
- Zapis: program może tworzyć i zmieniać dane;
- Zapis/odczyt: oba.
Zasady, których należy zawsze przestrzegać:
- Minimalne uprawnienia. Integracja księgowa, która tylko pobiera zamówienia, otrzymuje wyłącznie odczyt. Integracja magazynowa, która aktualizuje stany, potrzebuje zapisu, ale narzędzie do raportów już nie.
- Jeden klucz na jedną integrację, z jasnym opisem („Księgowość, tylko odczyt, 2026”). Gdy integracja przestaje być używana, unieważniają Państwo tylko ten klucz.
- Prosimy przypisać klucz do użytkownika z odpowiednimi uprawnieniami. Klucz administratora może wszystko, co może administrator. Lepiej utworzyć osobnego użytkownika z rolą Kierownik sklepu (lekcja 6.2).
- Tajną część należy przechowywać bezpiecznie. Widać ją tylko raz, podczas tworzenia. Jej miejsce jest w ustawieniach programu lub w menedżerze haseł, a nie w e-mailu, udostępnionym dokumencie czy publicznym repozytorium kodu.
- Porządkowanie. W sekcji REST API widać przy każdym kluczu, kiedy był ostatnio używany. Klucz, który od miesięcy nie był używany, należy unieważnić.
Webhooki: sklep sam powiadamia inny program
API czeka, aż ktoś o coś zapyta. Webhook działa odwrotnie: przy zdarzeniu w sklepie (nowe zamówienie, zmieniony produkt) WooCommerce sam wysyła wiadomość na wskazany przez Państwa adres. Dzięki temu program wysyłkowy od razu wie o nowym zamówieniu i nie musi pytać co minutę. Webhooki konfiguruje się w WooCommerce > Ustawienia > Zaawansowane > Webhooki.
Trzy rzeczy, na które warto zwrócić uwagę:
- Wiadomość zawiera dane osobowe. Webhook przy nowym zamówieniu przesyła imię i nazwisko, adres oraz zamówione produkty. Prosimy wysyłać je tylko na adres z https i do podmiotu wymienionego w polityce prywatności oraz w rejestrze czynności przetwarzania (lekcja 5.5).
- Tajny klucz. Przy webhooku wpisuje się tajny klucz. Dzięki niemu program odbierający może sprawdzić, że wiadomość rzeczywiście pochodzi z Państwa sklepu, a nie od kogoś, kto odgadł adres. Prosimy nie zostawiać go pustego i udostępniać go wyłącznie odbiorcy.
- Nieudane dostarczenie. Jeśli adres odbiorcy przez dłuższy czas jest nieosiągalny, WooCommerce może po wielokrotnych błędach wyłączyć webhook. Po awarii prosimy sprawdzić w sekcji Webhooki, czy są nadal aktywne.
Nie należy mylić tego z webhookiem operatora płatności (lekcja 4.4). Działa on w odwrotnym kierunku: operator informuje Państwa sklep, że płatność się powiodła.
W praktyce: tak to wygląda w WooCommerce
U innych dostawców hostingu działa to tak samo; są to elementy samego WooCommerce.
- Prosimy otworzyć w oknie prywatnym
/wp-json/wc/store/v1/productsw swoim sklepie (testowym). Proszę wyszukać produkt i przeliczyć cenę. - W tym samym oknie prywatnym prosimy otworzyć
/wp-json/wc/v3/orders. Powinien pojawić się status 401. - Prosimy przejść do WooCommerce > Ustawienia > Zaawansowane > REST API. Proszę sprawdzić, jakie klucze istnieją, do jakiego użytkownika są przypisane i z jakimi uprawnieniami. Klucze, których Państwo nie rozpoznają (lub już nie potrzebują), należy unieważnić.
- W sekcji Webhooki prosimy sprawdzić, jakie webhooki istnieją i na jaki adres trafiają.
- Jeśli używają Państwo wtyczki bezpieczeństwa, która ogranicza REST API, prosimy sprawdzić, czy Store API jest wyłączone spod tego ograniczenia.
Podsumowanie
- Store API (
wc/store/v1) jest publiczne i zawiera to, co widnieje na stronach produktów; bloki koszyka i zamówienia go potrzebują. - Prosimy nie umieszczać danych wewnętrznych w polach produktów: mogą stać się widoczne przez Store API.
- REST API WooCommerce (
wc/v3) bez klucza powinno zwracać 401; lista zamówień bez klucza oznacza możliwe naruszenie ochrony danych. - Klucze API: minimalne uprawnienia, jeden na integrację, przypisany do odpowiedniego użytkownika, przechowywany w tajemnicy, nieużywane należy unieważniać.
- Webhooki przesyłają dane osobowe do innego programu: tylko przez https, z tajnym kluczem, do podmiotu z rejestru czynności przetwarzania.
Quiz
Zadanie
Zadanie A2.4: Co Państwa sklep pokazuje publicznie? Prosimy wpisać adres swojego sklepu (testowego) oraz liczbę produktów widocznych w sklepie. Program wykonuje trzy zapytania, bez plików cookie i bez klucza, wyłącznie w trybie odczytu:
/wp-json/wc/store/v1/products?per_page=1(Store API, przez adres REST, który podaje sama witryna);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Prawidłowo oznacza: Store API odpowiada statusem 200 i listą JSON; nagłówek X-WP-Total jest równy wpisanej przez Państwa liczbie; orders i customers zwracają 401, 403 lub 404.
Pomarańczowy: X-WP-Total się różni (produkty w szkicu, prywatne lub ukryte nie są liczone); Store API zwraca 401 lub 403, zwykle z powodu wtyczki bezpieczeństwa, przez co bloki zamówienia nie działają.
Czerwony: Store API jest nieosiągalne, choć witryna działa na WooCommerce; albo orders lub customers zwracają listę. To drugie jest poważne: prosimy natychmiast zablokować dostęp, sprawdzić klucze API i wtyczki oraz ocenić, czy trzeba zgłosić naruszenie ochrony danych. W takim przypadku program zapisuje wyłącznie kod statusu, nigdy treść.
Następnie prosimy samodzielnie zajrzeć do sekcji REST API i Webhooki: jakie klucze i webhooki tam są i czy wiedzą Państwo, do czego służy każdy z nich?
Dalsza lektura
- Darmowy kurs WordPress 7.3: Logowanie: hasła, uwierzytelnianie dwuskładnikowe i ataki brute force
- Darmowy kurs WordPress 7.5: Zhakowana strona: rozpoznawanie, naprawa i zapobieganie
- Brak dostępu do xmlrpc.php w WordPressie
- Czy to jest wyciek danych i czy muszę go zgłosić?
- Store API (developer.woocommerce.com, po angielsku): https://developer.woocommerce.com/docs/apis/store-api/
- Rate limiting dla Store API (developer.woocommerce.com, po angielsku): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
