【问题标题】:Collecting/Processing headers in PHP Soap Server在 PHP Soap 服务器中收集/处理标头
【发布时间】:2009-07-06 17:03:15
【问题描述】:

我正在使用 PHP5 的本机 SOAP 方法创建一个 Web 服务。一切都很顺利,直到我尝试使用 SOAP 标头处理身份验证。

我可以很容易地找到如何将用户名/密码添加到 SOAP 标头,客户端

$myclient = new SoapClient($wsdl, $options);

$login = new SOAPHeader($wsdl, 'email', 'mylogin');
$password = new SOAPHeader($wsdl, 'password', 'mypassword');
$headers = array($login, $password);

$myclient->__setSOAPHeaders($headers);

但我在任何地方都找不到收集和处理这些标头服务器端的方法。我猜必须有一种简单的方法可以在我的 SoapServer 中定义一个处理标头的方法...

【问题讨论】:

    标签: php web-services soap


    【解决方案1】:

    对于现代 PHP 版本,不需要向 WSDL 添加任何内容,因为标头是 SOAP Envelope 规范的一部分。

    Paul Dixon 引用的用户贡献示例不起作用仅仅是因为标题不是评论中写的 UserToken,标题是 安全性,这就是类方法应该具有的名称。然后你会得到一个不错的 stdClass 对象,它带有一个 UserToken stdClass 对象属性,该属性具有 Username 和 Password 作为属性。

    示例代码(插入到实现 SOAP 服务的 PHP 类中:

       public function Security( $header  ){
          $this->Authenticated = true; // This should be the result of an authenticating method
          $this->Username = $header->UsernameToken->Username;
          $this->Password = $header->UsernameToken->Password;
        }
    

    对于基于用户名/密码的 WSSE Soap 安全性来说就像一个魅力

    【讨论】:

      【解决方案2】:

      SoapClient使用用户名和密码实现HTTP认证。支持基本和摘要式身份验证 (see source)

      有关在服务器端在 PHP 中实现 HTTP 身份验证的信息,请参阅this manual page

      如果您不想使用 HTTP 身份验证,请参阅 SoapServer 手册页上的 this user-contributed sample,其中显示了如何在 UsernameToken 标头中传递一些凭据。

      【讨论】:

      • 我正在尝试仅使用 SOAP 库来捕获标头,因此无需 HTTP 身份验证。我已经尝试过您提到的用户提供的示例,但它似乎只在我使用 WSDL 定义时才有效。也许我必须在 WSDL 中定义标题,我会继续搜索。谢谢您的意见。
      • 是的,您需要将标头定义到 WSDL 文件中。
      • osarogabriel.blogspot.com/2014/04/… 给了我很好的答复。看看吧,它非常清楚地解释了如何做到这一点。
      【解决方案3】:

      您可以尝试读取 RAW POST 数据。

      if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
      {
          $xml = file_get_contents('php://input');
          print( htmlspecialchars( $xml ) );
          // XML processing
      }
      

      在 $xml 中,您将拥有整个 SOAP XML 请求。

      SoapServer 没有读取 SOAP 标头的方法。

      -- 编辑:手册中提供的示例似乎不起作用,标题处理方法永远不会被调用

      【讨论】:

        【解决方案4】:

        您必须使用当前版本的 PHP。在 PHP 5.2.4 中我遇到了同样的问题,但是在 5.2.17 或 5.3.8 中,SOAP 标头处理的回调(在 php.net 上的用户提供的示例中描述)被调用并且一切正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-17
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多