1

私のSOAP-Serverは、soap-clientを認証するために、すべてのリクエストがsoap-headerに有効なトークンを持っていることを期待しています。このトークンは一定期間のみ有効であるため、すべての呼び出しで無効になると予想する必要があります。

SOAPサーバーで(再)認証した後、savonにSOAPヘッダーを再構築させる(つまり、新しい認証トークンを使用する)方法を見つけようとしています。それがサボンの問題なのかルビーの問題なのかはわかりません。これが私がこれまでに持っているものです。

class Soapservice
  extend Savon::Model

  # load stored auth-token
  @@header_data = YAML.load_file "settings.yaml"

  client wsdl: 'locally-cached-wsdl.xml', 
    soap_header: {'verifyingToken' => @@header_data}

  operations :get_authentification_token, :get_server_time

  # request a new auth-token and store it
  def get_authentification_token
    response = super(:message => {
        'oLogin' => {
            'Username' => 'username', 
            'Userpass' => 'password'
        }
    })

    settings = {
      'UserID' => response[:user_id].to_i,
      'Token' => response[:token], 
    }

    File.open("settings.yaml", "w") do |file|
        file.write settings.to_yaml
    end

    @@header_data = settings
  end

  def get_server_time
    return super()
    rescue Savon::SOAPFault => error
      fault_code = error.to_hash[:fault][:faultstring]
      if fault_code == 'Unauthorized Request - Invalide Token'
          get_authentification_token
          retry
      end
  end
end

電話すると

webservice = Soapservice.new
webservice.get_server_time

無効なトークンを使用すると、新しいトークンが再認証されて正常に保存されretryますが、新しいヘッダーは読み込まれません(結果は無限ループになります)。何か案は?

4

1 に答える 1

1

GitHubからrubiiiの回答を追加しました-今後の参考のためにここに発行してください:

class Soapservice

  # load stored auth-token
  @@header_data = YAML.load_file "settings.yaml"

  def initialize
    @client = Savon.client(wsdl: 'locally-cached-wsdl.xml')
  end

  def call(operation_name, locals = {})
    @client.globals[:soap_header] = {'verifyingToken' => @@header_data}
    @client.call(operation_name, locals)
  end

  # request a new auth-token and store it
  def get_authentification_token
    message = {
      'Username' => 'username', 
      'Userpass' => 'password'
    }
    response = call(:get_authentification_token, :message => message)

    settings = {
      'UserID' => response[:user_id].to_i,
      'Token'  => response[:token], 
    }

    File.open("settings.yaml", "w") do |file|
      file.write settings.to_yaml
    end

    @@header_data = settings
  end

  def get_server_time
    call(:get_server_time)
    rescue Savon::SOAPFault => error
      fault_code = error.to_hash[:fault][:faultstring]
      if fault_code == 'Unauthorized Request - Invalide Token'
        get_authentification_token
        retry
      end
  end

end

rubiiiが追加されました:

Savon :: Modelを削除したことに注意してください。実際には必要ないため、この回避策がサポートされているかどうかはわかりません。#callメソッドを見ると、すべてのリクエストの前にグローバルにアクセスして変更します。

于 2013-01-28T11:17:52.447 に答える