You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP通过REST API连接VCenter时认证出错,会话ID返回Null

解决vSphere REST API获取会话ID返回Null的问题

嘿,我看你用PHP cURL调用vSphere API时遇到了会话ID返回null的问题,后续查询VM列表也失败了——这大概率是请求头配置或者认证逻辑出了问题,我帮你梳理下关键点:

1. 冲突的认证头是核心问题

你加了vmware-use-header-authn: test这个请求头,但这个头是给基于请求头的认证机制用的,而你同时又开启了Basic Auth(通过CURLOPT_USERPWD),这俩放在一起会让vCenter的API搞不清该用哪种认证方式,直接导致会话创建失败,返回null。

2. 会话ID的解析逻辑有误

就算认证成功,vSphere返回的会话ID是包裹在{"value": "xxx"}这个JSON结构里的,你直接把整个$out对象赋值给$sid,后续用它作为请求头肯定无效。得先取$out->value才是正确的会话ID。

3. 修正后的完整代码

我把你的代码改了下,修复了上面的问题,还加了调试日志方便排查:

$ch = curl_init();
// 调试阶段暂时关闭SSL验证,生产环境一定要开启并配置CA证书!
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 只保留必要的请求头,移除冲突的vmware-use-header-authn
$headers = array(
 'Content-Type: application/json',
 'Accept: application/json'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// 会话创建接口
curl_setopt($ch, CURLOPT_URL, "https://vcsa/rest/com/vmware/cis/session");
curl_setopt($ch, CURLOPT_POST, 1);
// 确保用户名密码格式正确:username:password
curl_setopt($ch, CURLOPT_USERPWD, 'administrator@vs.dom:userpassword');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );

$response = curl_exec($ch);
// 先检查curl是否执行失败
if ($response === false) {
 echo 'Curl Error: ' . curl_error($ch);
 exit;
}

$out = json_decode($response);
// 检查JSON解析是否正常,以及是否返回了有效的会话ID
if (json_last_error() !== JSON_ERROR_NONE || !isset($out->value)) {
 echo '会话创建失败,原始响应:' . $response;
 exit;
}

$sid = $out->value;
echo "获取到会话ID:" . $sid . "\n";

// 调用VM列表接口
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
 "vmware-api-session-id: $sid",
 'Accept: application/json'
));
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, "https://vcsa/rest/vcenter/vm");

$output = curl_exec($ch);
if ($output === false) {
 echo '获取VM列表时Curl错误:' . curl_error($ch);
 exit;
}

$vms = json_decode($output);
var_dump($vms);

curl_close($ch);

额外调试建议

  • 先单独测试会话创建请求:打印$response看原始返回,如果是401 Unauthorized,说明用户名密码不对,或者用户没有API访问权限。
  • 验证vCenter API可用性:在浏览器里直接访问https://vcsa/rest/com/vmware/cis/session,输入用户名密码,看是否能返回包含value字段的JSON。
  • 检查用户权限:确保administrator@vs.dom至少有vCenter的“只读”权限,没有权限的话也会导致认证失败。

内容的提问来源于stack exchange,提问作者alessiow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:02