2009-07-06 54 views
7

我使用PHP5的本地SOAP方法創建Web服務。一切都很好,直到我嘗試使用SOAP Headers處理認證。在PHP 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中定義一個處理標題的方法...

回答

5

SoapClient使用用戶名和密碼來實現HTTP身份驗證。支持基本和摘要式身份驗證(see source

有關在服務器端使用PHP進行HTTP身份驗證的信息,請參見this manual page

如果你不想使用HTTP認證,見this user-contributed sample的SoapServer的手冊頁,其中展示瞭如何通過在UsernameToken的頭有些憑據。

+0

我試圖趕上只用頭SOAP庫,所以沒有HTTP認證,並且我已經嘗試了你提到的用戶提供的示例,但它似乎只在我*不*使用WSDL定義時才起作用 也許我必須在WSDL,我會繼續搜索。謝謝你的意見。 – altermativ 2009-07-07 14:21:34

1

您可以嘗試讀取RAW POST數據。

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

在$ xml中,您將有整個SOAP XML請求。

SoapServer沒有讀取SOAP標頭的方法。

- 編輯:貢獻例如從手動似乎並沒有工作,頭處理方法不會被調用

1

你必須使用PHP的最新版本。在PHP 5.2.4中,我遇到了同樣的問題,但是在5.2.17或5.3.8中,SOAP頭處理(在php.net上用戶貢獻的samle中描述)的回調被調用,並且一切正常。

5

擁有現代化的PHP版本是必要添加任何東西到WSDL作爲報頭是SOAP信封規範的一部分。

用戶貢獻例如由保羅·狄克遜引用不只是工作,因爲頭是不是UserToken寫在註釋,標題是安全,所以這是名稱的類方法應該有。然後,您將獲得一個帶UserToken stdClass對象屬性的stdClass對象,該對象屬性的用戶名和密碼屬性。

示例代碼(在一個實現了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安全的用戶名/密碼魅力