Я пытаюсь получить доступ к REST API Shopware. Я использую версию 5.1.3 Shopware. Я использую код документация.
Я всегда получаю http-код 400 (неверный или отсутствующий идентификатор).
Когда я пытаюсь получить доступ к API через Google Chrome, он работает после входа в систему с http-аутентификацией, поэтому учетные данные должны быть в порядке.
Я предполагаю, что заголовок аутентификации, который отправляет Chrome, отличается от того, который я отправляю с помощью PHP curl.
С Chrome:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Authorization:Digest username="demo", realm="Shopware REST-API", nonce="7aa6aa7e8089c60e5930cb45ead39197", uri="/api/articles", algorithm=MD5, response="cee77e425508605dfbcf2deda8f83938", opaque="d75db7b160fe72d1346d2bd1f67bfd10", qop=auth, nc=0000001e, cnonce="8b5121e862c4fce1"Cache-Control:max-age=0
Connection:keep-alive
Cookie:session-1=2d0cb2941684d2767e76ffeb48c7337706cba39c
Host:shopware.example.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
С PHP Curl
GET /api/articles? HTTP/1.1\r\n
Host: shopware.example.com\r\n
Authorization: Digest username="demo",realm="",nonce="806c9770a53bf2f82b87734a9d8eb98c",uri="/api/articles?",cnonce="60e6c8db046db8f4e63fece37e38f92e",nc=00000001,algorithm=MD5,response="299069d4659af386a4ec7058796267c2",qop="auth",opaque="d75db7b160fe72d1346d2bd1f67bfd10"\r\n
User-Agent: Shopware shopwareApiClient\r\n
Accept: */*\r\n
Content-Type: application/json; charset=utf-8\r\n
Content-Length: 2\r\n
Дополнительные директивы PHP curl для получения информации заголовка:
curl_setopt($this->cURL, CURLINFO_HEADER_OUT, true);
print_r(curl_getinfo($this->cURL, CURLINFO_HEADER_OUT ));
Код, который я использую:
<?php
namespace App;
class shopwareApiClient
{
const METHOD_GET = 'GET';
const METHOD_PUT = 'PUT';
const METHOD_POST = 'POST';
const METHOD_DELETE = 'DELETE';
protected $validMethods = array(
self::METHOD_GET,
self::METHOD_PUT,
self::METHOD_POST,
self::METHOD_DELETE
);
protected $apiUrl;
protected $cURL;
public function __construct($apiUrl, $username, $apiKey)
{
$this->apiUrl = rtrim($apiUrl, '/') . '/';
//Initializes the cURL instance
$this->cURL = curl_init();
curl_setopt($this->cURL, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->cURL, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($this->cURL, CURLOPT_USERAGENT, 'Shopware shopwareApiClient');
curl_setopt($this->cURL, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($this->cURL, CURLOPT_USERPWD, $username . ':' . $apiKey);
curl_setopt($this->cURL, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
));
curl_setopt($this->cURL, CURLINFO_HEADER_OUT, true);
}
public function call($url, $method = self::METHOD_GET, $data = array(), $params = array())
{
if (!in_array($method, $this->validMethods))
{
throw new Exception('Invalid HTTP-Methode: ' . $method);
}
$queryString = '';
if (!empty($params))
{
$queryString = http_build_query($params);
}
$url = rtrim($url, '?') . '?';
$url = $this->apiUrl . $url . $queryString;
$dataString = json_encode($data);
curl_setopt($this->cURL, CURLOPT_URL, $url);
curl_setopt($this->cURL, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($this->cURL, CURLOPT_POSTFIELDS, $dataString);
$result = curl_exec($this->cURL);
dd(curl_getinfo($this->cURL, CURLINFO_HEADER_OUT ));
$httpCode = curl_getinfo($this->cURL, CURLINFO_HTTP_CODE);
return $this->prepareResponse($result, $httpCode);
}
public function get($url, $params = array())
{
return $this->call($url, self::METHOD_GET, array(), $params);
}
public function post($url, $data = array(), $params = array())
{
return $this->call($url, self::METHOD_POST, $data, $params);
}
public function put($url, $data = array(), $params = array())
{
return $this->call($url, self::METHOD_PUT, $data, $params);
}
public function delete($url, $params = array())
{
return $this->call($url, self::METHOD_DELETE, array(), $params);
}
protected function prepareResponse($result, $httpCode)
{
echo "<h2>HTTP: $httpCode</h2>";
if (null === $decodedResult = json_decode($result, true))
{
$jsonErrors = array(
JSON_ERROR_NONE => 'No error occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been reached',
JSON_ERROR_CTRL_CHAR => 'Control character issue, maybe wrong encoded',
JSON_ERROR_SYNTAX => 'Syntaxerror',
);
echo "<h2>Could not decode json</h2>";
echo "json_last_error: " . $jsonErrors[json_last_error()];
echo "<br>Raw:<br>";
echo "<pre>" . print_r($result, true) . "</pre>";
return;
}
if (!isset($decodedResult['success']))
{
echo "Invalid Response";
return;
}
if (!$decodedResult['success'])
{
echo "<h2>No Success</h2>";
echo "<p>" . $decodedResult['message'] . "</p>";
return;
}
echo "<h2>Success</h2>";
if (isset($decodedResult['data']))
{
echo "<pre>" . print_r($decodedResult['data'], true) . "</pre>";
}
return $decodedResult;
}
}
Изменить: Найдено отчет об ошибке php в котором говорится об ошибке в PHP с Windows на версии 5.6 и выше. Я использую XAMP на Windows. Я собираюсь попробовать это на Linux, чтобы увидеть, работает ли он.
сообщение об ошибке было правильно. Я использовал XAMP с PHP 5.6 на Windows.
После помещения моего PHP-кода на Linux-машину этот код работает.
Цитировать сообщение об ошибке:
Описание:
попытка использовать curl_exec с дайджест-проверкой подлинности не работает должным образом.
запуск тестового сценария всегда не проходит проверку безопасности.
Использование браузера или Wget напрямую работает отлично.также, пытаясь запустить тот же тест на другом моем сервере, работает с Amazon Linux с PHP 5.5.21, но не работает с моей машины Windows 7 x64 с PHP 5.6.11.
попытка запустить тест с php 5.5 или 5.4 с помощью CLI на нескольких компьютерах с Windows привела к полному разрушению исполняемого файла php.
Похоже, ошибка № 69088 связана, но эта ошибка также возникает в Linux (5.5).
Тестовый скрипт:
<?
$curl = curl_init();
$curl_options = [
CURLOPT_HTTPAUTH => CURLAUTH_ANY,
CURLOPT_USERPWD => 'test_user:password',
CURLOPT_URL => 'http://test_user:[email protected]/digest-auth/auth/user/password',
CURLOPT_HEADER => true,
];
curl_setopt_array($curl, $curl_options);
curl_exec($curl);
curl_close($curl);
Ожидаемый результат:
{ "authenticated": true, "user": "user"}
Фактический результат:
"Authentication failed" (with header 401)
У меня та же проблема с PHP-клиентами / скриптами и CalDAV / SabreDAV-каркасом (также включенным в Owncloud, Baikal и т. Д.) На моем Apache 2.4.17 (Win32 / VC11 из Apachelounge на Win7 / 64).
Я немного поиграл с разными версиями релизов PHP 5.6.x и обнаружил следующее:
- php_curl.dll <= v5.6.4 — нет проблем
- php_curl.dll v5.6.5 / v5.6.6 — сбой с Auth_Digest
- php_curl.dll => v5.6.7 — сбой Auth_Digest
Эта ошибка также присутствует в версии PHP 5.5 и PHP 5.4 (последняя стабильная версия PHP_CURL.DLL, которую я обнаружил в v5.4.36).
Других решений пока нет …