Подключение к vCenter REST API с помощью PHP

Я пытаюсь получить информацию о виртуальной машине из VMware vCenter v6.5 с PHP 7. Я получаю код ошибки 400 от curl_getinfo.

Я скопировал код для этого из этого сообщения: аутентификация VCenter ReST API

Я пробовал это из командной строки и могу получить идентификатор сеанса, поэтому я знаю, что сервер отправляет информацию обратно, как следует, только не на веб-страницу PHP.

Ссылка на следующую команду: https://communities.vmware.com/thread/556377

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'vmware-use-header-authn: test' --header 'vmware-api-session-id: null' -u '[email protected]' 'https://vcenter.mydomain.local/rest/com/vmware/cis/session'
<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,'https://vcenter.mydomain.local/rest/com/vmware/cis/session');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, '[email protected]:Passw0rd');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
$headers = array(
'Content-Type: application/json',
'Accept: application/json',
'vmware-use-header-authn: test',
'vmware-api-session-id: null',
'Expect:'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$out = json_decode(curl_exec($ch));

if(!curl_exec($ch)){
die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}

$info = curl_getinfo($ch);
echo "<p>CURL URL: " . $info['url'];
echo "<p><font color=green>CURL Dump: <br>";
echo '<pre>';
var_dump($info);
echo "</pre>\n";
echo "<p>OUT:<br>";
var_dump($out);
if ($out === false) {
   echo 'Curl Error: ' . curl_error($ch);
   exit;
}
$sid = $out->value;

echo "<br>SID: " . $sid;

curl_close($ch);
?>

Я ожидаю, что результат $out->value будет идентификатором сеанса, вместо этого я получаю NULL. Благодарен за любую помощь, спасибо!


person SuperDogStar    schedule 16.01.2019    source источник
comment
ты когда-нибудь решал это?   -  person VladoPortos    schedule 28.09.2020
comment
@VladoPortos - Да, мне удалось заставить это работать отлично. Я считаю, что это произошло из-за проблемы с заголовками, которые я использовал.   -  person SuperDogStar    schedule 29.09.2020
comment
то же самое, у меня это работает ... теперь я бью головой из-за проблемы, пытаясь запросить билет из / mob ... method = acquTicket, он не работает с обнаружением возможной XSRF (подделки межсайтовых запросов), и я не могу получить передать это :(   -  person VladoPortos    schedule 29.09.2020


Ответы (3)


я предполагаю, что VCenter блокирует запросы без заголовка пользовательского агента, а curl-cli добавляет такой заголовок автоматически, а обертки libcurl / php - нет. пытаться

curl_setopt($ch,CURLOPT_USERAGENT, 'php/' . PHP_VERSION . ' libcurl/' . (curl_version()['version']));

тогда вы получите что-то вроде

User-Agent: php/7.1.16 libcurl/7.59.0

что правдиво :)

person hanshenrik    schedule 16.01.2019
comment
Спасибо, ханшенрик. Я добавил это, и теперь он показывает User-Agent: php / 7.2.14 libcurl / 7.29.0 в заголовке, но все еще не получил хорошего ответа. Вставка curl_dump в случае, если это помогает: pastebin.com/x2ZFSasp - person SuperDogStar; 17.01.2019
comment
@SuperDogStar хм ... а какие заголовки вы получите, если добавите --verbose в команду curl? - person hanshenrik; 17.01.2019
comment
Может ли проблема быть связана с Content-Length: -1 в заголовке? Также есть лишняя строка, откуда я не знаю. Curl_dump вставлен сюда из кода PHP: pastebin.com/x2ZFSasp - person SuperDogStar; 17.01.2019
comment
Хорошо, работает с подробным описанием. Мне также пришлось добавить --insecure в командную строку в конце, чтобы обойти проверку SSL, забыл добавить это выше. Результаты с --verbose в командной строке curl можно найти здесь: pastebin.com/pswSYk3b - person SuperDogStar; 17.01.2019

Ошибка http 400 вызвана этим заголовком:

curl_setopt($ch, CURLOPT_POST, true);

И замена его на этот решает проблему:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
person Arie Rave    schedule 18.01.2021

С помощью curl вы можете подключиться следующим образом:

curl -X POST \
  https://<your_vcenter>/rest/com/vmware/cis/session \
  -H 'Accept: application/json' \
  -H 'Authorization: Basic <encoded_password...see *1)' \
  -H 'Content-Type: application/json' \
  -H 'vmware-use-header-authn: SomerandomValue'

*1 => https://en.wikipedia.org/wiki/Basic_access_authentication**

Тогда вы получите ответ:

{
    "value": "vmware-api-session-id"
}

С этим идентификатором вы можете:

curl -X GET \
  https://<your_vcenter>/rest/vcenter/host \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'vmware-api-session-id: vmware-api-session-id' \
  -d '{
    "filter": {
    }
}'

и получить

{
    "value": [
        {
            "host": "host-1",
            "name": "esx01.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        },
        {
            "host": "host-2",
            "name": "esx02.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        }
    ]
}
person kaiSzy    schedule 20.11.2019