Отправка безопасных заголовков wse через Soap в php5 - PullRequest
3 голосов
/ 12 февраля 2011

У меня проблема с отправкой заголовков безопасности для использования веб-служб, и я уже пробовал несколько десятков способов использовать этот веб-сервис с TargetProcess.com, и я не уверен, что делаю неправильно.

(http://demo.tpondemand.com/Services/ProjectService.asmx?wsdl)

В их примере используется действительно старая версия Nusoap, однако я пытаюсь сделать это, используя php5, встроенный в класс SoapClient.

Я застрял между ошибками получения неверного запроса или невозможностью аутентификации. Так как я могу отправить эти заголовки?

Это то, что у меня есть, но не работает:

     $tp_header_part = '
      <wsa:Action>
        http://targetprocess.com/RetrieveAll
      </wsa:Action>
      <wsa:MessageID>
        urn:uuid:'.$this->getGuid().'
      </wsa:MessageID>
      <wsa:ReplyTo>
        <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
      </wsa:ReplyTo>
      <wsa:To>http://medios.tpondemand.com/Services/ProjectService.asmx</wsa:To>
      <wsse:Security SOAP-ENV:mustUnderstand="1">
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
          wsu:Id="SecurityToken-'.$this->getGuid().'">
        <wsse:Username>MYUSERNAME</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:UsernameToken>
      </wsse:Security>';


$soap_var_header = new SoapVar( $tp_header_part, XSD_ANYXML, null, null, null );

$soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'Security', $soap_var_header );
$client->__setSoapHeaders($soap_header);

p.s Функция getGuid просто генерирует guid, запрашиваемый в соответствии с их документацией.

Есть идеи?

1 Ответ

1 голос
/ 06 марта 2012

Если целевой сервер написан с использованием .NET / ASP, может быть очень сложно получить «идеальные» XML-запросы - например, при использовании префикса пространства имен важно включить объявление пространства имен в XMLа также.

Я могу видеть несколько примеров пространств имен в вашем XML (wsa, wsse, SOAP-ENV), которые, похоже, не являются delcared - и я был бы удивлен, если бы PHP SoapClient смогавтоматически заполнить их.Единственный, кого вы объявили полностью - это 'wsse' = 'http://schemas.xmlsoap.org/ws/2003/06/secext', через инициацию вашего объекта SoapHeader.

Если возможно, поместите анализатор пакетов (например, Fiddler2 ) междуPHP и целевой сервер, чтобы точно видеть, что отправляется и принимается - это может упростить отслеживание ошибок и выяснить, почему XML отклоняется.

Я бы предложил 2 модификации вашего исходного кода, которые должны сделать его "допустимым XML":

  • wsa: Action - добавить xmlns:wsa="<URL for definition of WSA>"
  • SoapHeader - я не уверен, но, поскольку вы поместили здесь URI пространства имен, может потребоваться включить префикс пространства имен в имя объекта:

    $soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'wsse:Security', $soap_var_header );
    

Однако самое важное - найти способ получить точный HTTP-диалог между клиентом PHP и целевым сервером - и если вы также можете получить рабочий пример для сравнения и сравнения, это обычно облегчает жизнь на 100%!

...