SoapUI новичок здесь. Я вызываю этот безопасный API Soap с SoapUI 5.3, и вот как заголовок безопасности был настроен в SoapUI:
show project view
WS-Security Configurations
табуляцияOutgoing WS-Security Configuration
вкладка и создать новый конфигWSS Entries
создано: Имя пользователя (проверено adds a nonce
а также adds a created
ящики и выбранный PasswordType as PasswordText
), Отметка времени (TTL 30, проверил Sets precision of timestamp to milliseconds
коробка)При отправке моего SOAP-запроса тип аутентификации Basic
и выбрал вышеуказанную конфигурацию.
Заголовок запроса SOAP теперь выглядит так:
<soapenv:Header>
<wsse:Security
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">
<wsu:Timestamp
wsu:Id="TS-68AE03334F6A9DBDDC150599839319940">
<wsu:Created>
2017-09-21T12:53:13.199Z
</wsu:Created>
<wsu:Expires>
2017-09-21T12:53:43.199Z
</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken
wsu:Id="UsernameToken-68AE03334F6A9DBDDC150599839319939">
<wsse:Username>
username
</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
password
</wsse:Password>
<wsse:Nonce
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
8NBStc5kqrgPWG9pj09Svw==
</wsse:Nonce>
<wsu:Created>
2017-09-21T12:53:13.199Z
</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
И все работает очень хорошо в SoapUI. Но в конечном итоге я собираюсь написать клиент на Java или PHP для использования этого API. Есть вещи, которые я хочу понять:
<wsu:Timestamp wsu:Id="TS-68AE03334F6A9DBDDC150599839319940">
wsu:Id
атрибут для Timestamp
а также Username
токены, есть ли критерии или я могу генерировать случайное значение для каждого в каждом запросе?nonce
: Та же история, что и 1 выше. Тем не менее, encodingType Base64Binary
, Я понимаю, что nonce
случайное значение, уникальное для каждого запроса, чтобы отразить атаки воспроизведения. Имея в виду encodingType, как мне последовательно создать хороший из моего php / Java-клиента? Когда я base64decode код, сгенерированный SoapUI, он все еще возвращается в двоичном виде, я ожидал String, что SoapUI делает здесь ??Ответ в SoapUI — XML, но когда я отправляю запрос из PHP, я получаю либо бинарный ответ, либо просто так:
bool(false)
Так как же SoapUI преобразовать ответ в обычный XML и как я могу сделать то же самое в моем коде ??
Вот мой тестовый скрипт PHP, который работал для меня как шарм с другими API-интерфейсами Soap:
<?php
$soap = '<soapenv:Envelope
xmlns:ns="http://soap.crmapi.util.redknee.com/common/xsd/2011/05"xmlns:ns1="http://soap.crmapi.util.redknee.com/common/xsd/2008/08"xmlns:ns2="http://soap.crmapi.util.redknee.com/subscriptions/xsd/2011/01"xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:sub="http://soap.crmapi.util.redknee.com/subscriptions/xsd/Subscriptions-v2.0">
<soapenv:Header>
<wsse:Security
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">
<wsu:Timestamp
wsu:Id="TS-68AE03334F6A9DBDDC150599839319940">
<wsu:Created>
2017-09-21T12:53:13.199Z
</wsu:Created>
<wsu:Expires>
2017-09-21T12:53:43.199Z
</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken
wsu:Id="UsernameToken-68AE03334F6A9DBDDC150599839319939">
<wsse:Username>
username
</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
password#
</wsse:Password>
<wsse:Nonce
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
8NBStc5kqrgPWG9pj09Svw==
</wsse:Nonce>
<wsu:Created>
2017-09-21T12:53:13.199Z
</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<sub:methodName>
<sub:header>
</sub:header>
<sub:subscriptionRef>
<ns2:mobileNumber>
256723009772
</ns2:mobileNumber>
<ns2:spid>
10
</ns2:spid>
</sub:subscriptionRef>
<!--Zero or more repetitions:-->
</sub:methodName>
</soapenv:Body>
</soapenv:Envelope>';
$header = array(
'Connection: Keep-Alive',
'Content-Length: ' . strlen($soap),
'SOAPAction:urn:methodName',
'Host:IP:Port'
);
$url = 'https://ip:port/services/SubscriptionService/';
$ch = curl_init($url); // LIVE
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $soap);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5000);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$result = curl_exec($ch);
echo "\nResult\n$result\n";
var_dump($result);
Это мой заголовок безопасности мыла
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" 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">
<wsu:Timestamp wsu:Id="TS-38771EEA66D91AA9451507304959249232">
<wsu:Created>2017-10-06T15:49:19Z</wsu:Created>
<wsu:Expires>2017-10-06T15:57:39Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="UsernameToken-38771EEA66D91AA9451507304959248231">
<wsse:Username>MyUser</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPassword</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">AfptyLZx14GWb3gdd1cx6g==</wsse:Nonce>
<wsu:Created>2017-10-06T15:49:19.248Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security></soapenv:Header>
Я пытаюсь зашифровать wsu: Id для элемента Timestamp и UsernameToken.
Значение
38771EEA66D91AA9451507304959249232
По-видимому, исходное значение соответствует DateTime для Created at Request, но метод, используемый для шифрования, я не знаю, вы нашли что-то для этого?
Других решений пока нет …