Я пытаюсь использовать рубиновый гем Savon для подключения к веб-сервису, предоставленному propertyware (http://propertyware.com/apidocs/Getting-Started). Я успешно подключился к сервису через SoapUI и выполнил запрос echoString. Когда я пытаюсь сделать то же самое через Ruby Я получаю ошибку аутентификации нулевого пользователя.
Вот что я попробовал в Ruby ...
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."}
Который производит следующий xml ...
<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>
Вот xml, созданный SoapUI ...
<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 включает в себя одноразовый ключ и временную метку созданного. Я не уверен, как заставить savon делать это, не переходя на переваривание аутентификации. (и это не работает).
Я не очень разбираюсь в способах веб-сервисов - любое руководство будет высоко ценится.
Также - вот ответ, когда я пытаюсь подключиться через savon:
<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>
ТИА! Боб
В версии Savon 2 вам необходимо следующее:
client = Savon.client do wsdl 'https://webservice/theservice.wsdl' wsse_auth("user", "pass", :digest) end
Попробуйте установить дайджест в wsse на true.Это даст Савону команду добавить одноразовый номер и createAt к запросу:
wsse.credentials 'username', 'pwd', :digest
См. Комментарии этого объекта для получения дополнительной информации
Я считаю, что первым шагом будет устранение ошибки.
<faultstring>User 'null' not authenticated (unknown user)</faultstring>
Ваши учетные данные не передаются службе.