【问题标题】:Sending secure wse headers via Soap in php5在 php5 中通过 Soap 发送安全的 wse 标头
【发布时间】:2011-02-12 17:57:00
【问题描述】:

我在发送安全 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。

有什么想法吗?

【问题讨论】:

  • 想知道您是否能够使其正常工作?我正在尝试连接 PHP 中的 .NET SOAP API,这简直是一场噩梦。

标签: php xml soap nusoap


【解决方案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:Action - 添加xmlns:wsa="&lt;URL for definition of WSA&gt;"
  • SoapHeader - 我不确定,但由于您已将命名空间 URI 放在此处,因此可能需要在对象名称中包含命名空间前缀:

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

不过,最重要的是找到某种方法来获得 PHP 客户端和目标服务器之间的确切 HTTP 对话 - 如果您还可以获得一个工作示例来进行比较和对比,那通常会使生活 100% 更轻松!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多