Modul 2 · 2.4
Vad din butik visar offentligt
Modul 2: Installera och konfigurera · Lästid: 10 minuter
Lärandemål: Efter den här lektionen kan du förklara vad Store API och REST API i WooCommerce är, vilka uppgifter som ska vara offentliga och vilka som inte ska det, och hur du använder API-nycklar och webhooks säkert.
Nyckelbegrepp: API, REST API i WordPress, Store API (wc/store/v1), REST API i WooCommerce (wc/v3), JSON, offentligt och skyddat, API-nyckel, läs- och skrivbehörighet, minsta behörighet, webhook, hemlig nyckel för en webhook, X-WP-Total
En butik med två dörrar
En besökare ser din butik som webbsidor. Men din butik har också "dörrar" för program: adresser där ett program kan hämta eller skicka uppgifter, utan sidans layout. En sådan dörr kallas API (application programming interface). WordPress har en under /wp-json/, REST API. WordPress-kursen visade i lektion 7.3 att du där till exempel kan hämta användarnamn om du inte skyddar något.
WooCommerce lägger till två egna API:er, med helt olika syften:
| Store API | REST API i WooCommerce | |
|---|---|---|
| Adress | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| För vem | En besökares webbläsare (blocken för varukorg och kassa, lektion 2.2) | Andra program: bokföring, lager, en app, en koppling till en marknadsplats |
| Kräver nyckel | Nej, offentligt | Ja, en API-nyckel från en administratör (eller en inloggad användare med behörighet) |
| Vad som finns där | Produkter, priser, lagerstatus, kategorier, recensioner; varukorgen och beställningen för besökaren själv | Allt: allas beställningar, kunder, kuponger, inställningar, rapporter |
Store API är alltså skyltfönstret: det som står på en produktsida i din butik finns också där, fast som data. REST API i WooCommerce är lagrets bakdörr: den ska vara låst.
Store API: vad en besökare (och vem som helst) kan hämta
Öppna i din webbläsare:
https://shop.example.com/wp-json/wc/store/v1/productsDu får en lista i JSON, ett textformat för data. För varje produkt ser du bland annat namnet, slugen, typen (enkel, variabel), adressen till produktsidan (permalink), artikelnumret (SKU), priserna, bilder, kategorier, om produkten finns i lager och om den går att köpa. I svarets rubrikrader står X-WP-Total: antalet produkter som butiken visar för besökare.
Några saker att känna till:
- Priserna anges i cent. En tekanna för € 34,95 (≈ 384 kr) står som
"price": "3495"med"currency_minor_unit": 2. Du delar med 100. Om priset är med eller utan moms beror på din inställning för "Visa priser i butiken" (lektion 4.1). Den egenskapen använder vi i uppgiften i lektion 4.1. - Bara det som är synligt. Produkter som är utkast, privata eller dolda i katalogen räknar Store API inte med. Därför kan
X-WP-Totalvara lägre än antalet i din administration. - Alla får läsa, men inte skriva hur som helst. Att lägga något i varukorgen eller gå till kassan via Store API går bara med en engångskod (nonce) från sidan, och då bara för just den besökarens egen varukorg.
Är det illa att detta är offentligt? Nej: det är samma uppgifter som står på dina produktsidor. En konkurrent som vill bevaka dina priser kan göra det med de vanliga sidorna också. Men tänk på det här: allt du skriver i ett produktfält kan hamna i Store API. Lägg aldrig inköpspriser, namn på leverantörer eller interna anteckningar i den korta eller långa beskrivningen "eftersom temat ändå inte visar det fältet".
Stäng inte heller av Store API. Blocken för varukorg och kassa behöver det (lektion 2.2). Säkerhetstillägg som "stänger av REST API för besökare" förstör därför ibland kassan. Vill du begränsa REST API, undanta då Store API.
Missbruk av Store API förekommer, men då på skrivsidan: angripare som med stulna kortnummer försöker göra tusentals små beställningar. Det kallas card testing; det handlar lektion 6.3 om.
REST API i WooCommerce: alltid bakom en nyckel
Öppna nu, utan att vara inloggad:
https://shop.example.com/wp-json/wc/v3/ordersRätt svar är ett felmeddelande med status 401 (inte inloggad) och en kod som woocommerce_rest_cannot_view. Din butik säger: "det här får du inte se". Så ska det vara. Får du här en lista med beställningar är något allvarligt fel: ett tillägg som öppnar behörigheter, anpassad kod i temat eller en nyckel som står i en offentlig adress. Då har du en möjlig personuppgiftsincident (WordPress-kursen, lektion 7.5, och kunskapsbasen 6749).
Program som behöver komma åt dina beställningar får en API-nyckel. Den skapar du under WooCommerce > Inställningar > Avancerat > REST API (Advanced > REST API). En nyckel består av två delar (en consumer key och en consumer secret) och hör till en WordPress-användare. Du väljer behörighet:
- Läs: programmet får hämta uppgifter;
- Skriv: programmet får skapa och ändra uppgifter;
- Läs/skriv: båda.
Regler du alltid följer:
- Minsta behörighet. En bokföringskoppling som bara hämtar beställningar får bara läsbehörighet. En lagerkoppling som uppdaterar lagersaldon behöver skrivbehörighet, men ett rapportverktyg gör det inte.
- En nyckel per koppling, med en tydlig beskrivning ("Bokföring, bara läsa, 2026"). Upphör en koppling återkallar du bara den nyckeln.
- Koppla nyckeln till en användare med lämplig behörighet. En administratörs nyckel kan allt som en administratör kan. Skapa hellre en separat användare med rollen Butiksägare (lektion 6.2).
- Förvara den hemliga halvan säkert. Du ser den en enda gång när du skapar den. Den hör hemma i programmets inställningar eller i en lösenordshanterare, inte i ett mejl, ett delat dokument eller ett offentligt kodförråd.
- Städa. Under REST API ser du för varje nyckel när den senast användes. En nyckel som inte har använts på flera månader återkallar du.
Webhooks: din butik ringer ett annat program
Ett API väntar tills någon frågar. En webhook fungerar tvärtom: vid en händelse i din butik (en ny beställning, en ändrad produkt) skickar WooCommerce själv ett meddelande till en adress som du anger. Så får ditt fraktprogram direkt veta att det finns en beställning, utan att fråga varje minut. Du ställer in dem under WooCommerce > Inställningar > Avancerat > Webhooks.
Tre saker att tänka på:
- Meddelandet innehåller personuppgifter. En webhook vid en ny beställning skickar med namn, adress och beställda produkter. Skicka det bara till en adress via https och till en part som finns med i din integritetspolicy och ditt register över behandlingar (lektion 5.5).
- Den hemliga nyckeln. För en webhook fyller du i en hemlig nyckel. Med den kan det mottagande programmet kontrollera att meddelandet verkligen kommer från din butik och inte från någon som har gissat adressen. Lämna den inte tom och dela den bara med mottagaren.
- Misslyckad leverans. Är den mottagande adressen onåbar en tid kan WooCommerce stänga av webhooken efter upprepade fel. Kontrollera efter en störning under Webhooks att de fortfarande är aktiva.
Blanda inte ihop detta med betalleverantörens webhook (lektion 4.4). Den fungerar åt andra hållet: leverantören meddelar din butik att en betalning har gått igenom.
I praktiken: så ser det ut i WooCommerce
Hos andra webbhotell fungerar det likadant; det här är delar av WooCommerce självt.
- Öppna
/wp-json/wc/store/v1/productsi ett privat fönster på din (test)butik. Leta upp en produkt och räkna om priset. - Öppna
/wp-json/wc/v3/ordersi samma privata fönster. Du ska se status 401. - Gå till WooCommerce > Inställningar > Avancerat > REST API. Se vilka nycklar som finns, för vilken användare och med vilken behörighet. Återkalla nycklar som du inte känner igen (längre).
- Se under Webhooks vilka webhooks som finns och till vilken adress de går.
- Har du ett säkerhetstillägg som begränsar REST API, kontrollera då att Store API är undantaget.
Sammanfattning
- Store API (
wc/store/v1) är offentligt och innehåller det som också står på dina produktsidor; blocken för varukorg och kassa behöver det. - Lägg inga interna uppgifter i produktfält: de kan bli synliga via Store API.
- REST API i WooCommerce (
wc/v3) ska ge 401 utan nyckel; en lista med beställningar utan nyckel är en möjlig personuppgiftsincident. - API-nycklar: minsta behörighet, en per koppling, till en lämplig användare, förvaras hemligt, oanvända återkallas.
- Webhooks skickar personuppgifter till ett annat program: bara via https, med en hemlig nyckel, till en part i ditt register över behandlingar.
Quiz
Uppgift
Uppgift A2.4: Vad visar din butik offentligt? Fyll i adressen till din (test)butik och antalet produkter som är synliga i din butik. Programmet gör tre förfrågningar, utan cookies och utan nyckel, bara läsning:
/wp-json/wc/store/v1/products?per_page=1(Store API, via den REST-adress som din webbplats själv anger);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Bra är: Store API svarar med status 200 och en JSON-lista; rubrikraden X-WP-Total är lika med antalet du fyllde i; orders och customers ger 401, 403 eller 404.
Orange: X-WP-Total avviker (produkter som är utkast, privata eller dolda räknas inte med); Store API ger 401 eller 403, oftast på grund av ett säkerhetstillägg, vilket gör att kassablocken inte fungerar.
Röd: Store API går inte att nå fast din webbplats kör WooCommerce; eller orders eller customers returnerar en lista. Det senare är allvarligt: stäng det direkt, kontrollera dina API-nycklar och tillägg, och bedöm om du måste anmäla en personuppgiftsincident. Programmet sparar i så fall bara statuskoden, aldrig innehållet.
Titta sedan själv under REST API och Webhooks: vilka nycklar och webhooks finns där, och vet du vad var och en är till för?
Läs mer
- Gratis WordPress-kurs 7.3: Inloggning: lösenord, tvåfaktorsautentisering och brute force
- Gratis WordPress-kurs 7.5: Hackad: upptäcka, åtgärda och förebygga
- WordPress: åtkomst till xmlrpc.php fungerar inte
- Är det här en dataläcka och behöver jag anmäla det?
- Store API (developer.woocommerce.com, engelska): https://developer.woocommerce.com/docs/apis/store-api/
- Rate limiting för Store API (developer.woocommerce.com, engelska): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
