Modul 2 · 2.4
Hvad din shop viser offentligt
Modul 2: Installation og opsætning · Læsetid: 10 minutter
Læringsmål: Efter denne lektion kan du forklare, hvad Store API og REST API i WooCommerce er, hvilke data der skal være offentlige, og hvilke der ikke skal, og hvordan du bruger API-nøgler og webhooks sikkert.
Centrale begreber: API, REST API i WordPress, Store API (wc/store/v1), REST API i WooCommerce (wc/v3), JSON, offentlig og afskærmet, API-nøgle, læse- og skriverettigheder, mindst mulige rettigheder, webhook, hemmelig nøgle til en webhook, X-WP-Total
En butik med to døre
En besøgende ser din shop som websider. Men din shop har også "døre" til programmer: adresser, hvor et program kan hente eller sende data uden sidens layout. Sådan en dør hedder et API (application programming interface). WordPress har et under /wp-json/, nemlig REST API. WordPress-kurset viste i lektion 7.3, at du dér for eksempel kan hente brugernavne, hvis du ikke afskærmer noget.
WooCommerce tilføjer to egne API'er med vidt forskellige formål:
| Store API | REST API i WooCommerce | |
|---|---|---|
| Adresse | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Til hvem | Den besøgendes browser (blokkene til kurv og kasse, lektion 2.2) | Andre programmer: bogføring, lager, en app, en kobling til en markedsplads |
| Kræver nøgle | Nej, offentlig | Ja, en API-nøgle fra en administrator (eller en logget ind bruger med rettigheder) |
| Hvad den indeholder | Varer, priser, lagerstatus, kategorier, anmeldelser; kurven og ordren for den besøgende selv | Alt: alles ordrer, kunder, rabatkoder, indstillinger, rapporter |
Store API er altså indgangen fra butiksvinduet: det, der står på en produktside i din shop, står også dér, bare som data. REST API i WooCommerce er lagerets bagdør: den skal være låst.
Store API: hvad en besøgende (og alle andre) kan hente
Åbn i din browser:
https://shop.example.com/wp-json/wc/store/v1/productsDu får en liste i JSON, et tekstformat til data. For hvert produkt ser du blandt andet navnet, slug'en, typen (simpelt, variabelt), adressen på produktsiden (permalink), varenummeret (SKU), priserne, billeder, kategorier, om det er på lager, og om det kan købes. I svarets headere står X-WP-Total: det antal produkter, som butikken viser besøgende.
Et par ting, du skal vide:
- Priser står i øre/cent. En tekande til € 34,95 (≈ 261 kr.) står som
"price": "3495"med"currency_minor_unit": 2. Du dividerer med 100. Om det er prisen med eller uden moms, afhænger af din indstilling under "Vis priser i butikken" (lektion 4.1). Den egenskab bruger vi i opgaven i lektion 4.1. - Kun det, der er synligt. Produkter, der er kladder, private eller skjult i kataloget, tæller Store API ikke med. Derfor kan
X-WP-Totalvære lavere end antallet i din administration. - Alle må læse, men ikke bare skrive. At lægge noget i kurven eller gå til kassen via Store API kan kun ske med en engangskode (nonce) fra siden, og kun for den besøgendes egen kurv.
Er det et problem, at det er offentligt? Nej: det er de samme data, som står på dine produktsider. En konkurrent, der vil følge dine priser, kan også gøre det via de almindelige sider. Men vær bevidst om, at alt, hvad du skriver i et produktfelt, kan ende i Store API. Skriv aldrig indkøbspriser, navne på leverandører eller interne noter i den korte eller lange beskrivelse, "fordi temaet alligevel ikke viser det felt".
Luk heller ikke Store API. Blokkene til kurv og kasse har brug for den (lektion 2.2). Sikkerhedsplugins, der "slår REST API fra for besøgende", ødelægger derfor nogle gange kassen. Vil du begrænse REST API, så undtag Store API.
Misbrug af Store API findes, men på skrivesiden: angribere, der med stjålne kortnumre forsøger tusindvis af små bestillinger. Det kaldes card testing; det handler lektion 6.3 om.
REST API i WooCommerce: altid bag en nøgle
Åbn nu, uden at være logget ind:
https://shop.example.com/wp-json/wc/v3/ordersDet rigtige svar er en fejlmeddelelse med status 401 (ikke logget ind) og en kode som woocommerce_rest_cannot_view. Din shop siger: "det må du ikke se". Sådan skal det være. Får du her en liste med ordrer, er der noget alvorligt galt: et plugin, der åbner rettigheder, tilpasset kode i temaet, eller en nøgle, der står i en offentlig adresse. Så har du et muligt brud på persondatasikkerheden (WordPress-kurset, lektion 7.5, og vidensbasen 6749).
Programmer, der skal have adgang til dine ordrer, får en API-nøgle. Den opretter du under WooCommerce > Indstillinger > Avanceret > REST API (Advanced > REST API). En nøgle består af to dele (en consumer key og en consumer secret) og hører til en WordPress-bruger. Du vælger rettighederne:
- Læs: programmet må hente data;
- Skriv: programmet må oprette og ændre data;
- Læs/Skriv: begge dele.
Regler, du altid følger:
- Mindst mulige rettigheder. En bogføringskobling, der kun henter ordrer, får kun læseadgang. En lagerkobling, der opdaterer lagerbeholdningen, har brug for skriveadgang, men et rapporteringsværktøj har ikke.
- Én nøgle pr. kobling, med en tydelig beskrivelse ("Bogføring, kun læs, 2026"). Stopper en kobling, tilbagekalder du kun den nøgle.
- Knyt nøglen til en bruger med passende rettigheder. En administrators nøgle kan alt, hvad en administrator kan. Opret hellere en separat bruger med rollen Webshop leder (lektion 6.2).
- Opbevar den hemmelige halvdel sikkert. Du ser den kun én gang, når du opretter den. Den hører hjemme i programmets indstillinger eller i en adgangskodeadministrator, ikke i en mail, et delt dokument eller et offentligt kodelager.
- Ryd op. Under REST API ser du for hver nøgle, hvornår den sidst blev brugt. En nøgle, der ikke er brugt i månedsvis, tilbagekalder du.
Webhooks: din shop ringer til et andet program
Et API venter, til nogen spørger. En webhook virker omvendt: ved en hændelse i din shop (en ny ordre, et ændret produkt) sender WooCommerce selv en besked til en adresse, du angiver. Så får dit forsendelsesprogram straks besked om en ny ordre uden at skulle spørge hvert minut. Du opsætter dem under WooCommerce > Indstillinger > Avanceret > Webhooks.
Tre ting, du skal være opmærksom på:
- Beskeden indeholder personoplysninger. En webhook ved en ny ordre sender navn, adresse og bestilte varer med. Send det kun til en adresse via https og til en part, der står i din privatlivspolitik og din fortegnelse over behandlingsaktiviteter (lektion 5.5).
- Den hemmelige nøgle. Ved en webhook udfylder du en hemmelig nøgle. Med den kan det modtagende program kontrollere, at beskeden virkelig kommer fra din shop og ikke fra nogen, der har gættet adressen. Lad den ikke stå tom, og del den kun med modtageren.
- Mislykket levering. Er den modtagende adresse utilgængelig i et stykke tid, kan WooCommerce deaktivere webhooken efter gentagne fejl. Tjek efter en driftsforstyrrelse under Webhooks, om de stadig er aktive.
Forveksl ikke dette med betalingsudbyderens webhook (lektion 4.4). Den virker omvendt: udbyderen fortæller din shop, at en betaling er gennemført.
I praksis: sådan ser det ud i WooCommerce
Hos andre hostingudbydere fungerer det på samme måde; det er dele af WooCommerce selv.
- Åbn
/wp-json/wc/store/v1/productsi et privat vindue på din (test)shop. Find et produkt, og omregn prisen. - Åbn
/wp-json/wc/v3/ordersi det samme private vindue. Du skal se status 401. - Gå til WooCommerce > Indstillinger > Avanceret > REST API. Se, hvilke nøgler der findes, hos hvilken bruger og med hvilke rettigheder. Tilbagekald nøgler, du ikke (længere) kender.
- Se under Webhooks, hvilke webhooks der findes, og hvilken adresse de sender til.
- Har du et sikkerhedsplugin, der begrænser REST API, så kontrollér, at Store API er undtaget.
Opsummering
- Store API (
wc/store/v1) er offentlig og indeholder det, der også står på dine produktsider; blokkene til kurv og kasse har brug for den. - Skriv ikke interne data i produktfelter: de kan blive synlige via Store API.
- REST API i WooCommerce (
wc/v3) skal give 401 uden nøgle; en liste med ordrer uden nøgle er et muligt brud på persondatasikkerheden. - API-nøgler: mindst mulige rettigheder, én pr. kobling, knyttet til en passende bruger, holdt hemmelige, ubrugte tilbagekaldes.
- Webhooks sender personoplysninger til et andet program: kun via https, med en hemmelig nøgle, til en part fra din fortegnelse over behandlingsaktiviteter.
Quiz
Opgave
Opgave A2.4: Hvad viser din shop offentligt? Udfyld adressen på din (test)shop og det antal produkter, der er synlige i din shop. Programmet laver tre forespørgsler, uden cookies og uden nøgle, kun læsning:
/wp-json/wc/store/v1/products?per_page=1(Store API, via den REST-adresse, dit websted selv angiver);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Godt er: Store API svarer med status 200 og en JSON-liste; headeren X-WP-Total er lig med det antal, du udfyldte; orders og customers giver 401, 403 eller 404.
Orange: X-WP-Total afviger (produkter, der er kladder, private eller skjulte, tælles ikke med); Store API giver 401 eller 403, som regel på grund af et sikkerhedsplugin, så kasseblokkene ikke virker.
Rødt: Store API kan ikke nås, selvom dit websted kører WooCommerce; eller orders eller customers returnerer en liste. Det sidste er alvorligt: luk det med det samme, kontrollér dine API-nøgler og plugins, og vurder, om du skal anmelde et brud på persondatasikkerheden. Programmet gemmer i så fald kun statuskoden, aldrig indholdet.
Se derefter selv under REST API og Webhooks: hvilke nøgler og webhooks findes der, og ved du for hver enkelt, hvad den bruges til?
Læs videre
- Gratis WordPress-kursus 7.3: Login: adgangskoder, totrinsbekræftelse og brute force
- Gratis WordPress-kursus 7.5: Hacket: genkende, reparere og forebygge
- WordPress: adgang til xmlrpc.php virker ikke
- Er det her et databrud, og skal jeg anmelde det?
- Store API (developer.woocommerce.com, engelsk): https://developer.woocommerce.com/docs/apis/store-api/
- Rate limiting for Store API (developer.woocommerce.com, engelsk): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
