OAuth Integration
Byg sikre integrationer med Shoporama API ved hjælp af OAuth 2.0
Hvad er OAuth?
OAuth gør det muligt for eksterne applikationer at få sikker adgang til Shoporama API'et på vegne af dine brugere, uden at de skal dele deres login-oplysninger.
Sikker
Ingen deling af passwords. Brugerne logger ind direkte hos Shoporama
Nem integration
Standard OAuth 2.0 flow som du kender fra andre tjenester
Fleksibel
Vælg præcist hvilke rettigheder din app skal have
OAuth Flow - Trin for trin
Send bruger til Shoporama
Din app sender brugeren til Shoporamas OAuth endpoint
https://www.shoporama.dk/admin/oauth/login?
client_id=Din_App_Navn
redirect_uri=https://example.com/callback
state=unik_session_id
Bruger logger ind
Brugeren logger ind med sine Shoporama credentials og vælger:
- Hvilken shop der skal gives adgang til
- Adgangsniveau (Læs, Skriv, eller Fuld)
Tokenet knyttes til brugeren. Har brugeren fået en anden rolle end Fuld adgang på webshoppen, kan tokenet kun det, rollen giver adgang til, uanset adgangsniveau. Se Adgangsniveau og brugerens rolle.
Modtag API token
Efter godkendelse sendes brugeren tilbage til din app med token:
https://example.com/callback?
token=79a25b2709c9a7742bcb...
shop_url=demo.shoporama.dk
shop_name=Demo Shop
api_endpoint=https://www.shoporama.dk/REST
webshop_id=1
access_level=all
state=unik_session_id
Brug API'et
Brug token til at kalde Shoporama API:
curl -H "Authorization: 79a25b2709c9a7742bcb..." \
https://www.shoporama.dk/REST/product
Klar til at komme i gang?
Start med at teste OAuth flowet eller læs mere om API'et
Komplette Implementeringseksempler
Fuld OAuth flow implementation - klar til copy/paste
Vanilla PHP Implementation
Ren PHP uden frameworks - en enkelt fil der håndterer hele OAuth flowet
<?php
// oauth.php - Gem denne fil på din server
session_start();
// Konfiguration - RET DISSE VÆRDIER
$CLIENT_ID = "Dit App Navn";
$REDIRECT_URI = "https://din-side.dk/oauth.php";
$OAUTH_URL = "https://www.shoporama.dk/admin/oauth/login";
// Start OAuth
if (isset($_GET["login"])) {
$_SESSION["state"] = bin2hex(random_bytes(16));
$url = $OAUTH_URL . "?" . http_build_query([
"client_id" => $CLIENT_ID,
"redirect_uri" => $REDIRECT_URI,
"state" => $_SESSION["state"]
]);
header("Location: $url");
exit;
}
// Modtag token
if (isset($_GET["token"]) && $_GET["state"] === $_SESSION["state"]) {
$_SESSION["token"] = $_GET["token"];
$_SESSION["api_url"] = $_GET["api_endpoint"];
echo "Success! Token gemt.";
echo "
Test API";
exit;
}
// Test API
if (isset($_GET["test"]) && isset($_SESSION["token"])) {
$ch = curl_init($_SESSION["api_url"] . "/product?limit=1");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: " . $_SESSION["token"]]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
echo "" . htmlspecialchars($result) . "
";
exit;
}
// Start side
echo "Login med Shoporama";
?>
Sådan bruger du det:
- Kopier koden til en fil kaldet
oauth.php - Ret
$CLIENT_IDog$REDIRECT_URI - Upload filen til din server
- Besøg siden og klik "Login med Shoporama"
Fejlfinding & Almindelige problemer
Almindelige OAuth fejl
access_denied
Brugeren afviste adgang. Vis en venlig besked og lad dem prøve igen.
invalid_client
Ukendt client_id. Tjek at din app navn er korrekt.
invalid_redirect_uri
Redirect URI matcher ikke. Skal være præcis samme URL.
state_mismatch
State parameter matcher ikke. Muligt CSRF angreb eller session timeout.
API fejl
401 Unauthorized
Token er ugyldig, udløbet, eller tilbagekaldt, fx fordi brugeren er fjernet fra shoppen. Bed brugeren om at logge ind igen. Er brugeren fjernet fra shoppen, skal en anden bruger med adgang til shoppen forbinde appen.
403 Forbidden
Tokenet må ikke foretage kaldet. Feltet error i svaret er insufficient_scope, hvis adgangsniveauet ikke tillader metoden, og insufficient_role, hvis rollen hos brugeren bag tokenet ikke giver adgang. Feltet message forklarer hvorfor.
429 Too Many Requests
Rate limit nået. Vent før næste request.
500 Server Error
Intern fejl. Prøv igen senere eller kontakt support.
Debug tips
Test med OAuth Test Client
Brug vores test client til at verificere din OAuth flow fungerer korrekt.
Test OAuth Flow →Log alle parametre
Log state, token og andre parametre for at debugge problemer.
Sikkerhed & Best Practices
Token opbevaring
- • Gem aldrig tokens i cookies eller localStorage
- • Brug server-side sessions eller krypteret database
- • Krypter tokens før opbevaring
- • Slet tokens når de ikke bruges længere
CSRF beskyttelse
- • Brug altid state parameter
- • Generer unik state for hver session
- • Verificer state i callback
- • Timeout state efter kort tid
HTTPS påkrævet
- • Brug kun HTTPS for redirect_uri
- • Alle API kald skal være over HTTPS
- • Undtagelse: localhost til udvikling
- • Tjek SSL certifikat gyldighed
Adgangsniveauer forklaret
| Niveau | Beskrivelse | Tilladt | Ikke tilladt |
|---|---|---|---|
| read | Læseadgang til data | GET requests | POST, PUT, DELETE requests |
| write | Oprette, ændre, og slette data | POST, PUT, DELETE requests | GET requests |
| all | Læse og skrive data | Alle HTTP metoder | – |
Anbefaling: Start med 'read' adgang under udvikling og opgradér kun til 'write' eller 'all' når det er nødvendigt for din applikations funktionalitet.
På login-siden hedder niveauerne Læs (read), Skriv (write), og Fuld (all). Brugerens rolle kan begrænse tokenet yderligere, se Adgangsniveau og brugerens rolle nedenfor.
Adgangsniveau og brugerens rolle
Adgangsniveauet bestemmer, hvilke HTTP-metoder tokenet må bruge. Tokenet knyttes desuden til den bruger, der godkendte adgangen. Har brugeren fået en anden rolle end Fuld adgang på webshoppen, fx Medarbejder, Marketing, eller Udvikler, kan tokenet kun det, rollen giver adgang til, uanset adgangsniveau. Det betyder:
- GET kræver, at rollen kan se området, fx ordrer eller produkter. POST, PUT, og DELETE kræver, at rollen kan rette det.
- Statistik (stats og top-products) kræver tilvalget Omsætning og statistik.
- At rette kostpriser kræver tilvalget Kostpriser og avance. Det samme gør lagerindstillingerne (minimumslager og kostpris, både at hente og rette dem) og opdatering af lagerværdien. Rapporterne om avance, ABC-analyse, og lageromsætning kræver både dette tilvalg og Omsætning og statistik. Uden tilvalget fjernes kostpriser og tal, der er beregnet ud fra dem (fx avance og lagerværdi), fra svarene.
- Sletning af produkter, ordrer, og kunder kræver tilvalget Sletning og masseimport. Det gør masseimport også, dvs. et POST med en liste af produkter eller kunder.
- Kreditering, annullering, og ændring af betalt-status på ordrer kræver tilvalget Refundering og annullering.
- Rollen Leverandør kan kun hente, rette, kopiere, og gendanne enkelte produkter på id, med Sletning og masseimport også slette dem, og hente og uploade billeder i billedarkivet. Er der valgt en leverandør for brugeren, gælder det kun leverandørens egne produkter. Produktlister og helt nye produkter håndteres i admin.
- Fjernes brugeren fra webshoppen, tilbagekaldes tokenet, og kald giver 401.
Brugere, der stadig har opsætningen fra før rollerne (de tidligere flueben Ordrehåndtering og Leverandør), begrænses først, når firmaadministratoren vælger eller ændrer deres rolle.
Parametrene, din app modtager efter godkendelse, fortæller ikke brugerens rolle. En begrænsning viser sig først, når et kald afvises med 403 og et svar som dette:
{
"error": "insufficient_role",
"message": "The user behind this token has the role 'Marketing' on this webshop, which does not allow PUT order. Ask the company administrator to change the role.",
"method": "PUT",
"path": "order/123",
"role": ["marketing"],
"option": null
}
Feltet role viser brugerens rolle, fx staff, marketing, eller developer. Feltet option viser det tilvalg, rollen mangler, fx refund. Er option null, giver rollen slet ikke adgang til ressourcen eller metoden.
Adgangsniveauet Fuld på login-siden er ikke det samme som rollen Fuld adgang. Skal din app kunne alt, skal en bruger med rollen Fuld adgang godkende adgangen. Du finder alle reglerne i API-dokumentationen, og rollerne er beskrevet i Roller og rettigheder.
Komplet API Dokumentation
Se alle tilgængelige endpoints, metoder og parametre i vores REST API dokumentation
Se API Dokumentation