Мне удалось аутентифицировать PHP-клиента, но не без особых усилий.
Сначала я попробовал следующее:
$header = new stdClass;
$credentials = new stdClass;
$credentials->Username="myuser";
$credentials->Password="mypass";
$header->UsernameToken = $credentials;
$securityNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$client->__setSoapHeaders($securityNamespace, 'Security', $header);
Это не сработало. Кажется, что PHP5 (v5.3.5 в моем случае) имеет ошибку, препятствующую появлению префикса пространства имен внутри вложенных тегов заголовка.
http://bugs.php.net/bug.php?id=48966
Я закончил с:
<UsernameToken><Username>myuser</Username><Password>myuser</Password></UsernameToken>
вместо:
<o:UsernameToken><o:Username>myuser</o:Username><o:Password>myuser</o:Password></o:UsernameToken>
Итак, мне пришлось жестко закодировать необходимый XML в переменной. Это уродливо, но работает:
$securityNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$headerContent = "<o:Security xmlns:o=\"$securityNamespace\">
<o:UsernameToken>
<o:Username>myuser</o:Username>
<o:Password>mypass</o:Password>
</o:UsernameToken>
</o:Security>";
$headerVar = new SoapVar($headerContent, XSD_ANYXML, null, null, null);
$header = new SoapHeader($securityNamespace, 'o:Security', $headerVar);
$client->__setSoapHeaders(array($header));
Надеюсь, это кому-нибудь пригодится.
Bye!