【问题标题】:mustUnderstand="1" in Savon Security HeaderSavon 安全标头中的 mustUnderstand="1"
【发布时间】:2015-02-26 22:11:58
【问题描述】:

这是服务的外观(来自 Soap UI):

<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <wsse:UsernameToken wsu:Id="UsernameToken-044848C648B0DCCFBC14248931953381">
        <wsse:Username>26613</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">h3hzoxJgSNIrNsJTc8gGwdNGhe0=</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">JvR9+Aefno3PVz++ik/47w==</wsse:Nonce>
        <wsu:Created>2015-02-25T19:39:55.336Z</wsu:Created>
    </wsse:UsernameToken>
</wsse:Security>

这是 savon 产生的结果:

<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>26613</wsse:Username>
    <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">NmU4NWNiYWIxM2M0ZmYyN2IxZjJiNGQ0MGZmZDJkNjJiODJmNmM5OQ==</wsse:Nonce>
    <wsu:Created>2015-02-25T16:55:40Z</wsu:Created>
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">lr8M7oMCjEsh7Maj07AyW4CoTlE=</wsse:Password>
  </wsse:UsernameToken>
</wsse:Security>

我注意到有一点不同的是 mustUnderstand 行。我试着像这样添加:

 client = Savon.client(
     wsdl: 'gofish?wsdl',
     pretty_print_xml: true,
     log: true,
     log_level: :debug,
     env_namespace: :soapenv,
     soap_header: {'wsse:Security' => 'mustUnderstand="1"'}
)

但这会产生以下内容:

<wsse:Security>mustUnderstand="1"</wsse:Security>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

这不是我想要的。关于如何进入 wsse:Security 元素(如 SoapUI)有什么想法吗?

编辑:

根据 Steffen 的建议,我得到以下结果:

<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cmn="http://www.sircon.com/WebServices/services/OnboardingServices.wsdl" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" soapenv:mustUnderstand="1">
  <soapenv: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>26613</wsse:Username>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">NTcyN2QyNjliYmMxZjg2Yjc2YjA0MTY0NjE5MjdjZjQ4ZGY0YzlhYQ==
</wsse:Nonce>
        <wsu:Created>2015-02-25T21:28:53Z</wsu:Created>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">h8Qfcn6gA4swa/l+LmJR+RdCSto=</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <cmn:RecruiterOnboardingRequest>
      <some>key</some>
      <and>another one</and>
    </cmn:RecruiterOnboardingRequest>
  </soapenv:Body>
</soapenv:Envelope>

编辑 2:

在此处针对此问题开票:https://github.com/savonrb/savon/issues/667。请随时查看以了解更多信息。

【问题讨论】:

    标签: ruby soap savon


    【解决方案1】:

    我认为您需要在客户端中定义命名空间,例如。

    client = Savon.client(
        wsdl: 'gofish?wsdl',
        pretty_print_xml: true,
        log: true,
        log_level: :debug,
        env_namespace: :soapenv,
        namespaces: {'soapenv:mustUnderstand' => "1"}
    )
    

    您可能还必须列出您需要的所有其他命名空间。

    你会尝试一些疯狂的事情。转到您的 gem 目录并找到该文件 ...akami-1.2.2/lib/akami/wsse.rb

    将第 158 行更改为

    :attributes! => { "wsse:Security" => { "xmlns:wsse" => WSE_NAMESPACE } }
    

    :attributes! => { "wsse:Security" =>
                                           { "mustUnderstand" => "1",
                                             "xmlns:wsse" => WSE_NAMESPACE} }
    

    这不漂亮,但它可能会工作

    【讨论】:

    • 这是有效的,但它没有将其插入安全标头,而是插入soapenv:Envelope。请参阅上面的更新输出。
    • 谢谢,我已经向 Savon 开了一张票,看看能否得到一些指导。如果看起来更合适,请随意跟进或添加其他输入。 github.com/savonrb/savon/issues/667
    • 我认为你的建议会奏效,但就像你说的那样,这可能有点疯狂,会让我脱离主线,这总是有点令人担忧。
    • WSDL 是否有可能没有定义我在soapUI 和Savon 中看到的一些差异?公司给了我一些我加载的特殊soapUI文件。可能有额外的配置让它在那里工作?
    • 我已经接受了这个,但是如果有其他旅行者遇到这个,他们应该参考 github 问题来了解 mustUnderstand 是可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多