2011-02-12 3 views
3

웹 서비스를 사용하기 위해 보안 헤더를 보내는 데 문제가 있습니다. 그리고 이미 TargetProcess.com에서이 웹 서비스를 사용하는 데 수십 가지 방법을 시도했지만 잘못된 것을 잘 모릅니다.php5의 Soap을 통해 보안 wse 헤더를 보내십시오.

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

는 예를하지만 내가 SoapClient 클래스에 내장이 사용 PHP5을하려고하고, Nusoap의 정말 오래된 버전을 사용 .

잘못된 요청 오류가 발생하거나 인증 할 수 없습니다. 그러면이 헤더를 어떻게 보낼 수 있습니까?

 $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); 

는 단순히 문서 당 requiered GUID를 생성 getGuid 기능을 p.s :

이것은 내가 지금까지 가지고 있지만 작동하지 않는 것입니다.

아이디어가 있으십니까?

+0

이 기능을 사용할 수 있는지 궁금하십니까? 나는 PHP에서 .NET SOAP API와 연결하려고 노력하고 있으며 악몽이었다. –

답변

1

대상 서버가 .NET/ASP를 사용하여 작성된 경우 "완벽한"XML 요청을 얻는 데 매우 까다로운 작업이 될 수 있습니다. 예를 들어 네임 스페이스 접두사를 사용할 때 네임 스페이스 선언을 XML뿐입니다.

XML (wsa, wsse, SOAP-ENV)에서 델파이로 표시되지 않는 네임 스페이스 예제를 볼 수 있습니다. PHP SoapClient가 자동으로 채울 수 있다면 놀라실 것입니다. 유일하게 선언 한 것으로 보이는 것은 SoapHeader 객체의 초기화를 통해 'wsse'= 'http://schemas.xmlsoap.org/ws/2003/06/secext'입니다.

PHP와 대상 서버 사이에 패킷 스니퍼 (예 : Fiddler2)를 삽입하여 전송 및 수신중인 내용을 정확히 볼 수 있습니다. 이렇게하면 오류 추적이 훨씬 쉬워지고 XML이 왜 거절 당한다.

  • WSA :

    나는 당신의 초기 코드에이 수정을 건의 할 것, 어떤은 "유효한 XML"하게한다고 - 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 % 쉽게 사용할 수 있습니다!