Проблемы с идентификатором пользователя WS02 / WSF PHP 2.1.0

StackOverflow https://stackoverflow.com//questions/11687135

Вопрос

я пытаюсь позвонить партнеру WS, используя UsernameToken.Я использую для этого ws02 wsf_2.0.0 под php5.2.x, и это потрясает.Теперь мы хотим перейти на другое решение, основанное на php5.3, к счастью, ws02 предоставляет тег 2.1.0, совместимый с php5.3.Я трачу время на то, чтобы ознакомиться с новыми функциями и документацией этого нового выпуска, особенно в отношении UsernameToken.Я понял, что в этом выпуске используется подпись в отношении UsernameToken с помощью сертификата и закрытого ключа.Я предполагаю, что это из-за политики асимметричной привязки к транспорту.В моем случае я не хотел ничего подписывать с помощью сертификата или чего-то еще.Я также читал, что ws02 предоставляет своего рода запасной вариант в отдельном xml-файле, чтобы избежать какой-либо подписи.

После прочтения многих постов, форумов мне нужна некоторая помощь сообщества, потому что я полностью застрял.

Вот код, используемый для запроса WS в php5.3 - wsf 2.1.0 (с использованием HTTP)

$policy   = new \WSPolicy( $policy ); ( $policy is the one from the call_back folder with a file_get_contents() )

$security = new \WSSecurityToken( array(
  'user'                    => 'my_username',
  'password'                => 'my_password',
  'passwordType'            => 'Digest',
  'ttl'                     => '300'
));

$this->oSoapClient = new \WSClient( array(
  wsdl:          http://www.xxx.xx/comparatorservices/CalculationService?WSDL
  to:            http://www.xxx.xx/comparatorservices/CalculationService
  useWSA:        true
  useSOAP:       1.1,
  policy:        $policy,
  securityToken: $security
));

$proxy = $this->oSoapClient->getProxy();
$response = $proxy->wykonajKalkulacje( $MySuperRequestObject );

На этом этапе :

  1. Я активировал трассировки отладки (уровень журнала 4)
  2. Я подтверждаю, что мой "to" использует http в соответствии с определением wsdl

    wsdl:имя порта="CalculationServiceHttpPort" привязка="tns:CalculationServiceHttpBinding" wsdlsoap:местоположение адреса="http://www.xxxx.xx/comparatorservices/CalculationService" /wsdl:порт

Теперь из журналов отладки я улавливаю это :

[Wed Jul 25 05:22:53 2012] [error] rampart_in_handler.c(91) [rampart]SOAP header cannot be found.
[Wed Jul 25 05:22:53 2012] [error] phase.c(224) Handler RampartInHandler invoke failed within phase Security
[Wed Jul 25 05:22:53 2012] [error] engine.c(657) Invoking phase Security failed
[Wed Jul 25 05:22:53 2012] [error] engine.c(262) Invoking operation specific phases failed for operation __OPERATION_OUT_IN__
[Wed Jul 25 05:22:53 2012] [error] /home/agruet/08_KRK_sources/wso2-wsf-php-src-2.1.0/src/wsf_wsdl.c(1226)      [wsf_wsdl] Response envelope not found

Итак, моей первой идеей было перехватить трафик и особенно заголовок SOAP между рабочим (wsf_2.0.0 / php5.2.x) и поврежденным (wsf_2.1.0 / php5.3)

Вот версия 2.0.0 (рабочая)

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <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:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>my_username</wsse:Username>

            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">
              hashed(my_password)
            </wsse:Password>

            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-26T20:40:26.991Z</wsu:Created>

        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

И версия 2.1.0 (не работает/ сломана )

         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Header>
         <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

            <wsse:Username>my_username</wsse:Username>
            <wsse:Password
                Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">hashed(my_password)</wsse:Password>
            <wsse:Nonce>hashed</wsse:Nonce>
            <wsu:Created>2012-07-25T00:44:56.758Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

Как вы можете видеть, единственное отличие исходит от пространства имен wsse:Security.( отсутствуют xml-файлы:soapenv="http://schemas.xmlsoap.org/soap/envelope/ )

И это все ...

Проверка rampart_in_handler.c в строке 91 в соответствии с журналом отладки, в котором говорится :

soap_header = axiom_soap_envelope_get_header(soap_envelope, env);
    if(!soap_header)
    {
        /*No SOAP header, so no point of proceeding. FAIL*/
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart]SOAP header cannot be found.");
        return AXIS2_FAILURE;
    }

В смысле, да....значение soap_header равно false..но почему?Есть ли здесь какой-нибудь умный парень, который мог бы объяснить, что не так?

примечание 1:Я проверил политику, отправленную партнеру WS из рабочей версии (2.0.0), похоже, используется асимметричная привязка...что странно, поскольку в версии 2.0.0 мы не предоставили никаких сертификатов или ключей.

примечание 2:Я также попытался использовать подписанный токен username с классическими параметрами массива объектов WSPolicy - я создал сертификат x509 и privatekey, затем использовал функции для загрузки этих файлов и использовал параметры массива для загрузки его в конструктор WSSecurity...но я получаю ту же ошибку / Обнюхивание - это боль, потому что данные зашифрованы или что-то в этом роде (что, похоже, является нормальным в этом смысле)

примечание 3:В настоящее время тестируется на Ubuntu10.04-3LTS с предварительно скомпилированными пакетами php из apt-get

ПОЖАЛУЙСТА, ПОМОГИТЕ!

Это было полезно?

Решение

Я, наконец, нашел проблему и исправил rampart_in_handler.c:91

Проблема была связана с ответом, а не с запросом...Я проверил с помощью анализатора tcp, и ответ от партнера WS был получен без какого-либо заголовка soap:.

Соответствует стандартам или нет, но с последней версией (2.0.0) это работало.Поэтому я решил немного подправить код в файле rampart_in_handler.c, чтобы вернуть успешный результат в случае отсутствия заголовка soap...

На мой взгляд, и, пожалуйста, поправьте меня, если я ошибаюсь :

Тест на ответ SOAPHeader был добавлен, конечно же, из-за транспорта asymmetricbinding и нового случая signed usernametoken.Однако, если мы хотим использовать usernametoken без подписи ( через основные policy.xml ) и ответ сделан без какого-либо заголовка soap: ;тогда rampart всегда будет возвращать ошибку...

Кроме того, я проанализировал php-код в папке scripts/ относительно того, как wsf обрабатывает ответ, и я увидел в этом файле : wsf_wsdl.php в рамках функции wsf_process_response() :

if($response_header_string && !empty($response_header_string)) {
    $header_dom = new DomDocument();
    $header_dom->preserveWhiteSpace = FALSE;
    $header_dom->loadXML($response_header_string);
}

Это означает, что на стороне php, когда данные получены, wsf/php принимает регистр без какого-либо SOAPHeader...(сбоя нет, если отсутствует SOAPHeader ) Супер странно!?

Наконец, но не в последнюю очередь, я обнаружил странную ошибку на обоих wsf_wsdl_serialization.php и wsf_wsdl_deserialization.php файлы.

Например, если вы планируете отправлять и/или получать параметры/значения с такой строкой, как эта :

                            "110% Sigma of something" 

Это приведет к сбою и создаст ошибку сегмента во время процесса сериализации/несериализации!

Теперь я сам удивляюсь, почему?Но на первый взгляд, конечно, "110% Sig.." содержит "% S", и это довольно близко к "%s"...

Я думаю, что эта ошибка упомянута здесь :

http://old.nabble.com/WSF-PHP-server-segfault-on-wsf_wsdl_serialization.php---td24329956.html

Если я изменю S на D или что-нибудь еще, это сработает...

Какая боль...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top