在php5中通过Soap发送安全的wse头

时间:2011-02-12 17:57:00

标签: php xml soap nusoap

我在发送安全wse标头以使用Web服务时遇到问题,并且已经尝试了几种使用TargetProcess.com的Web服务的方式,我不确定我做错了什么。

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

他们的示例使用了一个非常旧的Nusoap版本,但我尝试使用内置在SoapClient类中的php5来实现这一点。

我在接收错误请求错误或无法进行身份验证之间遇到困难。那么我该如何发送这些标题?

这是我到目前为止所做的,但不起作用:

     $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 个答案:

答案 0 :(得分:1)

如果目标服务器是使用.NET / ASP编写的,那么获取“完美”XML请求可能非常繁琐 - 例如,在使用命名空间前缀时,必须在XML中包含命名空间的声明同样。

我可以在你的XML(wsa,wsse,SOAP-ENV)中看到几个名称空间的例子,它们似乎没有被删除 - 如果PHP SoapClient能够自动填充它们,我会感到惊讶。您似乎完全声明的唯一一个是'wsse'='http://schemas.xmlsoap.org/ws/2003/06/secext',通过启动您的SoapHeader对象。

如果可能的话,在PHP和目标服务器之间放一个数据包嗅探器(例如Fiddler2),以确切地查看正在发送和接收的内容 - 这可以使跟踪错误变得容易得多,并找出原因XML被拒绝了。

我建议对您的初始代码进行2次修改,这应该使其成为“有效的XML”:

  • wsa:操作 - 添加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 );
    

最重要的是找到一些方法来获得PHP客户端和目标服务器之间的确切HTTP对话 - 如果你还可以得到一个比较和对比的工作示例,那通常会让生活变得更容易100%! / p>