2011-10-25 1 views
1

ruby ​​gem Savon을 사용하여 propertyware (http://propertyware.com/apidocs/Getting-Started)에서 제공하는 웹 서비스에 연결하려고합니다. SoapUI를 통해 서비스에 성공적으로 연결하고 echoString 요청을 실행했습니다. Ruby를 통해 동일한 작업을 시도 할 때 null 사용자 인증 오류가 발생합니다. 여기 Ruby - Savon 웹 서비스 인증

는 ... 여기
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:web="http://propertyware.com/pw/services/PWServices" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ins0="http://propertyware.com/pw/services/PWServices" 
    xmlns:ins1="http://criteria.soap.propertyware.com" 
    xmlns:ins2="urn:PWServices" 
    xmlns:ins3="http://soap.propertyware.com" 
    xmlns:ins4="http://xml.apache.org/xml-soap"> 
    <env:Header> 
     <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1"> 
       <wsse:Username>user</wsse:Username> 
       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pwd</wsse:Password> 
      </wsse:UsernameToken> 
     </wsse:Security> 
    </env:Header> 
    <env:Body> 
     <web:echoString> 
      <arg>Hello world.</arg> 
     </web:echoString> 
    </env:Body> 
</env:Envelope> 

가 SoapUI에 의해 생성 된 XML이의

다음 XML을 생성
require 'rubygems' 
require 'savon' 

client = Savon::Client.new do 
    wsdl.document = 'http://propertyware.com/pw/services/PWServices?wsdl' 
    wsse.credentials 'username', 'pwd' 
end 

response = client.request :web, :echo_string, :body => {:arg => "Hello world."} 

... 내가 루비 시도했습니다 무엇

<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:web="http://webservices" > 
    <soapenv:Header> 
     <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsse:UsernameToken wsu:Id="UsernameToken-1" 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#PasswordText">pwd</wsse:Password> 
      <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">R41mCRd+tY+xthhE/YISLQ==</wsse:Nonce> 
      <wsu:Created>2011-10-25T09:52:40.220Z</wsu:Created> 
     </wsse:UsernameToken> 
     </wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <web:echoString soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <arg xsi:type="xsd:string">?</arg> 
     </web:echoString> 
    </soapenv:Body> 
</soapenv:Envelope> 

분명히 다른 점은 SoapUI에는 nonce 키와 createdAt 타임 스탬프가 포함된다는 것입니다. 나는 사바를 어떻게 소화 시키려고하지 않고서 그것을 할 수 있을지 확신하지 못한다. (그리고 작동하지 않는 fwiw).

저는 웹 서비스의 방식에서 진정한 사보이가 아닙니다. 어떤 지침이든지 크게 감사 할 것입니다.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <soapenv:Fault> 
      <faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:Server.Unauthenticated</faultcode> 
      <faultstring>User 'null' not authenticated (unknown user)</faultstring> 
      <detail> 
       <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">rcpppwwwapt012.realpage.com</ns2:hostname> 
      </detail> 
     </soapenv:Fault> 
    </soapenv:Body> 
</soapenv:Envelope> 

TIA를 : -

또한 내가 savon를 통해 연결을 시도 할 때 여기에 대한 응답입니다! Bob

답변

2

wsse의 다이제스트를 true로 설정해보십시오. 이 요청에 비표 및 createdAt을 추가 Savon을 지시합니다 :

wsse.credentials 'username', 'pwd', :digest 

내가 첫 번째 단계는 오류를 처리하는 것입니다 생각 this object for more info

+0

감사합니다. 불행히도 질문에 언급 한대로 다이제스트를 true로 설정하면 암호가 암호화되어 작동하지 않습니다. –

0

의 주석을 참조하십시오.

<faultstring>User 'null' not authenticated (unknown user)</faultstring> 

자격 증명은 서비스에 전달되지 않습니다. Savon 버전 2에서

+0

Yeap. 이것이이 질문이 요구하는 것입니다 - 왜 그렇습니까? 요청이 그들이 나에게 전송되는 것처럼 보입니다. 왜 서버가이를 인정하지 않는지 확실하지 않습니다. –

2

당신은 다음과 같은 필요 : 제안에 대한

client = Savon.client do 
    wsdl 'https://webservice/theservice.wsdl' 
    wsse_auth("user", "pass", :digest) 
end