Возникли проблемы при получении токена безопасности от службы онлайн-маркеров безопасности Microsoft (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-скрипта:
<?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.
</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 вариант.
Итак, вам нужно прочитать файл самостоятельно и передать содержимое опции.