Я подключаюсь к веб-сервису с SOAPUI, у меня правильные учетные данные. Сервер требует PasswordDigest, с данное время и т.д. Когда я звоню в сервис с SOAPUI, оно работает.
Когда я использую WSSoapClient класс php от https://gist.github.com/silasrm/a57a1e3af165cb43644b712192625a3b
или немного разработанная версия от https://gist.github.com/Turin86/5569152,
Я получаю:
Обнаружена ошибка при обработке заголовка
Маркер безопасности не может быть аутентифицирован или авторизован
соответственно.
Руководство по MS https://msdn.microsoft.com/en-us/library/ms977327.aspx объясняет:
Одноразовый номер имеет длину 16 байтов и передается как закодированное в base64 значение.
Приведенные там примеры показывают, что данное время отправлено base64’d.
В первой версии WSSoapClient данное время случайное число (не обязательно имеет 16 байтов), это pack () ‘d и base64 ()’ d.
Во второй версии данное время случайное число только sha1’d. Я не думаю, что это может быть правильно, так как «оригинальное» содержание данное время должен быть соединен с временем и паролем, затем base64 (pack (sha1 ())).
Правильный заголовок из SOAPUI и ошибочный заголовок из мыльных клиентов php выглядят одинаково, за исключением вычисляемых значений:
<wsse:UsernameToken wsu:Id="UsernameToken-01010101010101010101010101">
<wsse:Username>XXXXXXXX</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">jbpPIWuudp4l/l+ZqoR4iAN08lU=</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">yXy5R5w6I3km75hha8mYqg==</wsse:Nonce>
<wsu:Created>2018-08-27T09:07:54.101Z</wsu:Created>
Короче говоря: у вас есть рабочая версия некоторого ws-security SoapClient в php?
Задача ещё не решена.
Других решений пока нет …