Rails Savon SOAP身份验证

时间:2012-05-16 23:56:28

标签: ruby-on-rails-3 authentication soap savon

我正在开发Rails 3并使用Savon(savonrb.com)

  1. 我需要通过SOAP连接到Web服务
  2. Web服务需要身份验证
  3. 我可以连接,但无法获得authonticated ...

    我使用SOAP UI进行测试&一切正常。

    这是我的Rails代码的样子:

    client = Savon::Client.new do
      wsdl.document = "http://services.blahblah.com/Service.asmx?WSDL"
    end
    
    client.wsse.credentials "username", "password", :digest
    
    if response.success?
    
      @soap_status = 'Connected'
      @data = response.to_array(:get_brochure_response, :error_message)
    
    end
    

    我收到回复但是:error_message返回身份验证失败...

    以下是它在SOAP UI中的外观

    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ser="http://services.blahblah.com/service">
       <soap:Header>
          <ser:ICEAuthHeader>
             <!--Optional:-->
             <ser:Username>username</ser:Username>
             <!--Optional:-->
             <ser:Password>password</ser:Password>
          </ser:ICEAuthHeader>
       </soap:Header>
       <soap:Body>
          <ser:GetBrochure>
        <!--Optional:-->
             <ser:MappedID>123</ser:MappedID>
          </ser:GetBrochure>
       </soap:Body>
    </soap:Envelope>
    

3 个答案:

答案 0 :(得分:1)

用户名和密码是否与标头中的SOAP请求一起发送?如果是这样,您可以在初始化Savon客户端时执行此操作(请参阅cannot set SOAP header parameters on savon call):

client = Savon.client(
    wsdl: SOAP_WSDL,
    endpoint: SOAP_URL,
    soap_header: { :username => username, :password => password }
)

顺便提一下,如果只有某些呼叫需要身份验证,您可以进行如下调用:

response = client.call(
    :soap_call,
    :soap_header => { :username => username, :password => password },
    message: {message}
)

答案 1 :(得分:0)

您可以尝试使用基本身份验证进行身份验证:

client = Savon::Client.new do
  wsdl.document = "http://services.blahblah.com/Service.asmx?WSDL"
  http.auth.basic "username", "password"
end

答案 2 :(得分:0)

client = Savon.client( wsdl: 'http://service.example.com?wsdl',soap_header: { "AuthenticateRequest" => {"apiKey" => "****** your api *********"}}, pretty_print_xml: true)

client.operations

response = client.call(:function)

这里&#34; apiKey&#34;是我的apms认证api,你可以是不同的