2012-12-04 35 views
1

我想創建一個WSS頭來驗證安全的Web服務。使用SimpleXML創建WS-Security標頭?

我可以用一個醜陋的做到這一點:

$auth = ' 
    <wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsu:Timestamp wsu:Id="Timestamp-28" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
      <wsu:Created>' . $timestamp . '</wsu:Created> 
      <wsu:Expires>' . $timestampExpires . '</wsu:Expires> 
     </wsu:Timestamp> 
     <wsse:UsernameToken wsu:Id="UsernameToken-27" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
      <wsse:Username>' . $user . '</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">' . $passdigest . '</wsse:Password> 
      <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">' . $encodedNonce . '</wsse:Nonce> 
      <wsu:Created>' . $timestamp . '</wsu:Created> 
     </wsse:UsernameToken> 
    </wsse:Security>'; 

我現在正在試圖做到這一點清潔劑,使用SimpleXML。

但是,如果我嘗試做一個簡單:

$xml = new SimpleXMLElement('<wsse:Security/>', 0, false, 'wsse'); 

我得到:

警告:的SimpleXMLElement :: __結構()的SimpleXMLElement .--構建]: 命名錯誤:命名空間前綴wsse on安全未定義

我想我錯過了創建命名空間xml的方法,你能給我一些提示嗎?

回答

0

我找到了一種方法來解決我的問題:

$root = new SimpleXMLElement('<root/>'); 

$security = $root->addChild('wsse:Security', 'test', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); 

$root->registerXPathNamespace('wsse', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); 
$auth = $root->xpath('/root/wsse:Security'); 
echo htmlentities($auth[0]->asXML()); 

顯示:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">test</wsse:Security> 

而且也有在我的XML錯誤,我把SOAP-ENV:mustUnderstand="1"但我從來沒有定義SOAP-ENV命名空間。