Magento ver. 1.7.0.2
Я новичок в Magento, REST и oauth. Я хочу иметь возможность использовать Magento REST API, чтобы иметь возможность изменять интернет-магазин с помощью системы управления клиентами. Я смог создать Magento достаточно легко, но я борюсь с REST, особенно с oauth.
В настоящее время я запускаю Magento на MAMP 2.1.1 на OSX 10.7.5. Я смог установить OAUTH, используя следующие направления: Установка PHP OAuth в среде MAMP
После учебника Magento я использую RESTClient Firefox для проверки OAuth. Я создал роли и потребитель в Magento и поместил ключи в соответствующие поля в RESTClient.
Когда я отправляю сообщение
http://localhost:8888/store/oauth/initiate?oauth_callback=http://localhost:8888/store/oauth_admin.php
Я получаю ответ
oauth_problem=signature_invalid&debug_sbs=QiIiTo3WGTZLTOhyIest9B5+l5s=
Использование тестового PHP-скрипта на Magento ( http://www.magentocommerce.com/api/rest/introduction.html )
<?php /** * Example of products list retrieve using admin account via Magento REST API. oAuth authorization is used */ $callbackUrl = "http://localhost:8888/store/oauth_admin.php"; $temporaryCredentialsRequestUrl = "http://localhost:8888/store/oauth/initiate?oauth_callback=" . urlencode($callbackUrl); $adminAuthorizationUrl = 'http://localhost:8888/store/admin/oAuth_authorize'; $accessTokenRequestUrl = 'http://localhost:8888/store/oauth/token'; $apiUrl = 'http://localhost:8888/store/api/rest'; $consumerKey = 'obscured'; $consumerSecret = 'obscured'; session_start(); if (!isset($_GET['oauth_token']) && isset($_SESSION['state']) && $_SESSION['state'] == 1) { $_SESSION['state'] = 0; } try { $authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI; $oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType); $oauthClient->enableDebug(); if (!isset($_GET['oauth_token']) && !$_SESSION['state']) { $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl); $_SESSION['secret'] = $requestToken['oauth_token_secret']; $_SESSION['state'] = 1; header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']); exit; } else if ($_SESSION['state'] == 1) { $oauthClient->setToken($_GET['oauth_token'], $_SESSION['secret']); $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl); $_SESSION['state'] = 2; $_SESSION['token'] = $accessToken['oauth_token']; $_SESSION['secret'] = $accessToken['oauth_token_secret']; header('Location: ' . $callbackUrl); exit; } else { $oauthClient->setToken($_SESSION['token'], $_SESSION['secret']); $resourceUrl = "$apiUrl/products"; $oauthClient->fetch($resourceUrl); $productsList = json_decode($oauthClient->getLastResponse()); print_r($productsList); } } catch (OAuthException $e) { print_r($e); } ?>
Я получаю следующую ошибку:
Notice: Undefined index: state in /Applications/MAMP/htdocs/store/test.php on line 23 Notice: Undefined index: state in /Applications/MAMP/htdocs/store/test.php on line 29 OAuthException Object ( [message:protected] => Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect) [string:private] => [code:protected] => 401 [file:protected] => /Applications/MAMP/htdocs/store/test.php [line:protected] => 31 [trace:private] => Array ( [0] => Array ( [file] => /Applications/MAMP/htdocs/store/test.php [line] => 31 [function] => getRequestToken [class] => OAuth [type] => -> [args] => Array ( [0] => http://localhost:8888/store/oauth/initiate?oauth_callback=http%3A%2F%2Flocalhost%3A8888%2Fstore%2Foauth_admin.php ) ) ) [lastResponse] => oauth_problem=signature_invalid&debug_sbs=c3Pb0LJa26al02LJh9hSubXlBs8= [debugInfo] => Array ( [sbs] => GET&http%3A%2F%2Flocalhost%3A8888%2Fstore%2Foauth%2Finitiate&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A8888%252Fstore%252Foauth_admin.php%26oauth_consumer_key%3D41rv8qwkai1og9yp6ragyew5rag5e9oj%26oauth_nonce%3D10898187885101843ed45b24.99726561%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1359053886%26oauth_version%3D1.0 [headers_sent] => GET /store/oauth/initiate?oauth_callback=http%3A%2F%2Flocalhost%3A8888%2Fstore%2Foauth_admin.php&oauth_consumer_key=41rv8qwkai1og9yp6ragyew5rag5e9oj&oauth_signature_method=HMAC-SHA1&oauth_nonce=10898187885101843ed45b24.99726561&oauth_timestamp=1359053886&oauth_version=1.0&oauth_signature=F36aIxyET2XEVXDCJxm4jxGsRPg%3D HTTP/1.1 User-Agent: PECL-OAuth/1.2.3 Host: localhost:8888 Accept: */* [headers_recv] => HTTP/1.1 401 Authorization Required Date: Thu, 24 Jan 2013 18:58:06 GMT Server: Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8r DAV/2 PHP/5.2.17 X-Powered-By: PHP/5.2.17 Content-Length: 70 Content-Type: application/x-www-form-urlencoded [body_recv] => oauth_problem=signature_invalid&debug_sbs=c3Pb0LJa26al02LJh9hSubXlBs8= [info] => About to connect() to localhost port 8888 (#0) Trying ::1... connected Connected to localhost (::1) port 8888 (#0) Connection #0 to host localhost left intact Closing connection #0 ) )
Насколько я могу судить, я сделал все правильно, за исключением того, что полностью вытереть Magento и сделать новую установку после выяснения того, как установить Oauth. Я не знаю, что делать дальше, и любая помощь будет очень признательна, спасибо.
Я узнал, что вы не можете указать номер порта для URL-запроса Oauth. Номер порта разделяется, поэтому, когда ключи сравниваются, они не совпадают. Изменение порта до 80 (чтобы он не включался в URL-адрес) решил проблему.
Просто переопределите Mage_Oauth_Model_Server::_validateSignature()
, в строке 52 (magetno CE 1.8.1)
$this->_request->getHttpHost()
и сделать это:
$this->_request->getHttpHost(!Mage::getIsDeveloperMode())
Таким образом, если вы находитесь в режиме разработчика (установите его в SetEnv
в части SetEnv
<Directory />
), метод не будет SetEnv
номер порта, а также не изменит поведение производственной среды.
++