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

时间:2015-04-21 07:25:08

标签: php bash curl saml

从Microsoft Online Security Token Service(STS)获取安全令牌时遇到问题。它工作正常,我收到令牌,使用以下bash脚本:

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

但是当我尝试使用以下php脚本获取令牌时,我得到了一些“无效请求”。

$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-script的结果:

<?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-scripts之间的区别是什么,他们为什么不发送相同的POST?

2 个答案:

答案 0 :(得分:2)

使用:

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

而不是:

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

后者只是设置一个字符串而不是实际加载想要的内容。

答案 1 :(得分:1)

从文件加载的'@'前缀是由curl命令行工具完成的魔术,而不是由libcurl的CURLOPT_POSTFIELDS选项完成。

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