Ověření eshopu pomocí OAuth

Pokud potřebujete ukládat nastavení pro jednotlivé instalace doplňku, lze pro identifikaci administrátorů eshopu použít OAuth server.

Pokud využijete tento mechanismus autentizace uživatele, tak budete mít jistotu, že uživatel je skutečně administrátorem eshopu a nemusíte řešit jeho přístupové údaje a opravnění pro editaci nastavení vašeho doplňku.

Tento mechanismus je pouze ověřovacím a neumožnuje ukládat data (typicky nastavení doplňku) – ty si musíte ukládat sami do svojí datové struktury.

Postup předpokládá, že máte ve své databázi API access tokenu uložené číslo eshopu. Jinak řečeno, že z čísla eshopu shopId dokážete použít správný API access token.

Prvním krokem k identifikaci uživatele a jeho eshopu je zjistění hostname OAuth serveru, vůči kterému budete identitu uživatele ověřovat.

1. Získání adresy OAuth serveru

Zadejte v popisu doplňku „Odkaz na externí nastavení doplňku“. Pokud do url uvedete řetězec #SHOP_ID#, bude tento nahrazen skutečným id eshopu.

Příklad: https://www.mujserver.cz/shoptet/doplnky/muj-doplnek/nastaveni?eshopId=#SHOP_ID# bude v odkazu nahrazeno např. https://www.mujserver.cz/shoptet/doplnky/muj-doplnek/nastaveni?shopId=12345

Z obdrženého eshopId si ve své databázi zjistíte příslušný API access token a zavoláte endpoint Eshop info. V odpovědi v urls s ident hodnotou oauth je adresa oauth serveru uživatele, který se přihlásit.

<?php
$baseOauthUrl = getOauthUrl($response); // vase funkce pro ziskani url z odpovedi od endpointu eshop info

2. Uživatele přesměrujete na OAuth server eshopu.


$_SESSION['base_oauth_url'] = $baseOauthUrl;

Hostname si uložte k aktuálnímu uživateli (např. do session) – hodnotu budete potřebovat i v dalším kroku.

Sestavíme url, na kterou uživatele přesměrujete.

$url = $_SESSION['base_oauth_url'] . 'authorize'; // $_SESSION['base_oauth_url'] obsahuje koncove lomitko

Do url přidáme GET parametry:

// Vaše klientské id v OAuth serveru
// Zde je pouze příklad, konkrétní hodnotu najdete v administraci partnerského eshopu -> propojení -> API partner -> přístup k api
$param['client_id'] = 'wae54...slekn';
// skupina práv v OAuth serveru, zadejte 'basic_eshop'
$param['scope'] = 'basic_eshop';

Pro větší bezpečnost přidejte state parametr.

$state = uniqid();
$_SESSION["state"] = $state;
$param['state'] = $state;

State parametr je nepovinný a používá k ochraně před XSRF útoky. Hodnotu state si vygenerujete a uložíte k uživateli. Když state přidáte do požadavku na oauth server, tak parametr a jeho hodnota bude přidaná do odpovědi od auth serveru. Kontrola viz. níže.

Dále přidáme parametry response_type a redirect_uri.

// response_type je vždy 'code'
$param['response_type'] = 'code';
// zpáteční url (na váš server), na kterou OAuth server přesměruje uživatele po o úspěšném ověření
// redirect_uri je potřeba zadat v nastavení doplňku jako "URL pro autorizaci uživatele". OAuth server kontroluje shodnost adres, pokud adresa zadaná v administraci nesouhlasí s poslanou adresou OAuth server odpoví chybou
$param['redirect_uri'] = 'https://www.mujserver.cz/shoptet/doplnky/muj-doplnek/code';
// vytvoříme url a uživatele přesměrujeme na oauth serveru
$url = $url . "?" . http_build_query($param);
header("Location: " . $url);

3. Získání OAuth access tokenu

Dalším krokem se získání OAuth access tokenu, se který se získá identita uživatele resp. eshopu.
POZOR: Tento OAuth access token je odlišný od OAuth access tokenu, který získáváte při instalaci doplňku.

Po přesměrování v kroku 2. OAuth server ověří uživatele a přesměruje ho na vaši adresu redirect_uri.
V GET parametrech dostanete hodnotu code a volitelně state.

<?php
$code = $_GET['code'];
$state = $_GET['state'];
// Kontrola state parametrů. Když budou hodnoty odlišné, tak požadavek inicioval někdo jiný než vy a Váš kód by neměl pokračovat.
if ($state != $_SESSION['state]) {
    die('State parametry nesouhlasí');
}

Sestavíme parametr požadavku pro získání OAuth access tokenu. Požadavek se posílá na pozadí, bez vědomí uživatele.


$data = [ // $code je hodnota z GET parametru 'code' => $code, // grant_type je vždy 'authorization_code' 'grant_type' => 'authorization_code', // Vaše klientské id v OAuth serveru // Zde je pouze příklad, konkrétní hodnotu najdete v administraci partnerského eshopu -> propojení -> API partner -> přístup k api 'client_id' => '{$partnerProject->oauthClientId|escape}', // Váš tajný řetězec pro komunikaci s OAuth serverem // Kontaktujte Shoptet, pokud hodnotu neznáte 'client_secret' => '123l4kjl12k3j4ce098kjh34acghkyp4jsj1h324', // redirect_uri je potřeba zadat v nastavení doplňku jako "URL pro autorizaci uživatele". OAuth server kontroluje shodnost adres, pokud adresa zadaná v administraci nesouhlasí s poslanou adresou OAuth server odpoví chybou 'redirect_uri' => 'https://www.mujserver.cz/shoptet/doplnky/muj-doplnek/code', // zadejte 'basic_eshop' 'scope' => 'basic_eshop' ]; $url = $_SESSION['base_oauth_url'] . 'token';

Pošlete POST požadavek:

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if ($err) {
    die("CURL Error: " . $err);
}

V odpovědi bude access_token ve formátu json:

{"response":{"access_token":"90r3azmxy6dbxzpjfxj237cjt8rp0f4hq6uygone78i4n4zk47xb649pls1097fc0xs501hjhpv9tlj2k9hc6xhutymtthet8dzx0sm1ih7r6ml6gf6hc4dixqn48l0r5qk1ynqp0fvojief30b2f70rnedfcy2zyqhkin326ynvdv404hn1xw8nqct6rkn9h4xm9za2i53pbb8hqkmz37qdpol5yr3dciftn0vl04jfvpxg4l36lnw9vsqdyke","expires_in":43200,"token_type":"bearer","scope":"basic_eshop"}}
$response = json_decode($response, TRUE);
$accessToken = $response['access_token'];

4. Získání identity eshopu

Identitu eshopu získáte z odpovědi OAuth serveru.

Pošlete požadavek na OAuth server s autorizační hlavičkou, ve které je hodnota OAuth access tokenu.

Sestavte url, na kterou budete požadavek posílat:

$url = $_SESSION['base_oauth_url'] . 'resource?method=getBasicEshop';

OAuth access token se posílá v hlavičce požadavku:

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $accessToken]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl);
curl_close($curl);

Pokud je požadavek v pořádku vyřízen, obsahuje $response klíč success s hodnotou true.

{"success":true,"data":{"user":{"email":"novak@fenix.myshoptet.com","name":"Jan Novak"}, "project": {"id":159834,"url":"https:\/\/fenix.myshoptet.com\/","name":"F\u00e9nix"}}}

V $response v objektu data je id a url, které identifikuje eshop.

$response = json_decode($response, TRUE);
$_SESSION['project_id'] = $response['data']['project']['id'];

Získáním project_id máte spojeného aktuálního uživatele vašich stránek s administrátorem eshopu.

Identifikace chyb
Pokud dojde k chybě, je v $response klíč error a error_description

{"error":"You must use `client_secret`. Please contact us to obtain one.","error_description":null}
Facebook
Twitter