HTTP POST 适用于 bash 但不适用于 php

HTTP POST works with bash but not php

从 Microsoft 在线安全令牌服务 (STS) 获取安全令牌时遇到问题。它工作正常,我收到令牌,当使用以下 bash 脚本时:

curl -X POST -d @/var/www/extSTS.srf https://login.microsoftonline.com/extSTS.srf

但是当我尝试使用以下 php-脚本获取令牌时,我得到了一些 'Invalid request' 作为结果。

$target_url = 'https://login.microsoftonline.com/extSTS.srf';
$data = '@/var/www/extSTS.srf';
$ch = curl_init($target_url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);
curl_close ($ch);
echo $result;

php-脚本的结果:

<?xml version="1.0" encoding="utf-8" ?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault"><S:Body><S:Fault><S:Code><S:Value>S:Sender</S:Value><S:Subcode><S:Value>wst:InvalidRequest</S:Value></S:Subcode></S:Code><S:Reason><S:Text xml:lang="en-US">Invalid Request</S:Text></S:Reason><S:Detail><psf:error><psf:value>0x80048820</psf:value><psf:internalerror><psf:code>0x80045c01</psf:code><psf:text>Invalid STS request.&#x000D;&#x000A;</psf:text></psf:internalerror></psf:error></S:Detail></S:Fault></S:Body></S:Envelope>

我的问题是 bash- 和 php- 脚本之间有什么区别,为什么它们不发送相同的 POST?

作品使用:

$data = file_get_contents('/var/www/extSTS.srf');

而不是:

$data = '@/var/www/extSTS.srf';

后者只是设置了一个字符串,并没有实际加载想要的内容。

从文件加载的“@”前缀很神奇,它由 curl 命令行工具完成,而不是由 libcurl 的 CURLOPT_POSTFIELDS 选项完成。

因此,您需要自己读取文件并将内容传递给选项。