Я хочу запускать команды Cloudstack через вызовы API, но, очевидно, у меня не получается создать подпись.
<?php
$baseurl = "http://localhost:8080/client/api?";
$response = "response=json";
$command = "command=listUsers";
$apikey = "Z-dr9dp6gZbKmrl9stAm6uGBSWqSonMhc2i-nqVlSG6MlpvqWFWW1uVJEZnrrwq_drQXDWRFTGwZ1p_qarLzwQ";
$secretkey = "p_iiuI3oDxBCxmUgceAHYf-f9uotX9B-uK2qxmVAT_bbYfPdhiePnlPRjbL6CvtPH8gDbjIh8uGPmP1KjN6HBQ";
$hash = hash_hmac("sha1",strtolower($apikey . "&" . $command),$secretkey, true);
$base64encoded = base64_encode($hash);
$signature = "signature=" . urlencode($base64encoded);
$link = $baseurl . "apikey=" . $apikey . "&" . $command . "&" . $response . "&" . $signature;
$responseconents = file_get_contents($link);
print $link;
?>
Сгенерированная ссылка на URL: http://localhost:8080/client/api?apikey=Z-dr9dp6gZbKmrl9stAm6uGBSWqSonMhc2i-nqVlSG6MlpvqWFWW1uVJEZnrrwq_drQXDWRFTGwZ1p_qarLzwQ&command=listUsers&response=json&signature=H57C0kDRw4CZjEPQvFvrrPEJ%2FiM%3D
Ошибка i ' m получение:
Ошибка HTTP-запроса! HTTP / 1.1 401 Неавторизованный
Используется это руководство (из слайда 11) в качестве ссылки, но оно для python.
EDIT
после попытки предложения @CBroe
$baseurl = "http://localhost:8080/client/api?";
$response = "response=json";
$command = "command=listUsers";
$apikey = "apikey=Z-dr9dp6gZbKmrl9stAm6uGBSWqSonMhc2i-nqVlSG6MlpvqWFWW1uVJEZnrrwq_drQXDWRFTGwZ1p_qarLzwQ";
$secretkey = "p_iiuI3oDxBCxmUgceAHYf-f9uotX9B-uK2qxmVAT_bbYfPdhiePnlPRjbL6CvtPH8gDbjIh8uGPmP1KjN6HBQ";
$hash = hash_hmac("sha1",strtolower($apikey . "&" . $command . "&" . $response),$secretkey, true);
$base64encoded = base64_encode($hash);
$signature = "signature=" . urlencode($base64encoded);
$link = $baseurl . $apikey . "&" . $command . "&" . $response . "&" . $signature;
$responsecontents = file_get_contents($link);
$responsejson = json_decode($responsecontents);
print $responsejson
Если я удаляю строку печати без вывода, при добавлении print $responsejson
получаю
PHP Устранимая фатальная ошибка: объект класса stdClass не удалось преобразовать в строку
Кажется, у меня больше нет ошибки 401, но теперь я не могу видеть вывод команды.
EDIT II
После добавив
var_dump($responsecontents);
в конце, все работает как положено, теперь я могу видеть пользователей в формате JSON.
Спасибо @ CBroe