将命名空间添加到Suds中的默认WSSE安全对象

Jim*_*ket 5 python suds

我了解如何向SOAP请求添加标头。但这会生成与我需要传递的标头不匹配的标头。返回此标头:

   <SOAP-ENV:Header>
      <wsse:Security mustUnderstand="true">
         <wsse:UsernameToken>
            <wsse:Username>CABLE</wsse:Username>
            <wsse:Password>CABLE</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
   </SOAP-ENV:Header>
Run Code Online (Sandbox Code Playgroud)

但是,我需要修改该标头的名称空间,以传递Security对象和UsernameToken对象的特定名称空间。我似乎无法弄清楚如何覆盖提供的默认值。

<soapenv:Header>
 <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">
       http://schemas.xmlsoap.org/ws/2002/07/secext
 <wsse:UsernameToken xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
 <wsse:Username>CABLE</wsse:Username>
 <wsse:Password Type="wsse:PasswordText">CABLE</wsse:Password>
 </wsse:UsernameToken>
 </wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)

这是生成以上代码的Python代码

security = Security()
token = UsernameToken('CABLE', 'CABLE')
security.tokens.append(token)
client.set_options(wsse=security)
Run Code Online (Sandbox Code Playgroud)

Jim*_*ket 4

弄清楚了。这就是答案。只需使用 ns 参数

def createWSSecurityHeader(username,password):
    # Namespaces
    wsse = ('wsse', 'http://schemas.xmlsoap.org/ws/2002/07/secext')

    # Create Security Element
    security = Element('Security', ns=wsse)

    # Create UsernameToken, Username/Pass Element
    usernametoken = Element('UsernameToken', ns=wsse)
    uname = Element('Username', ns=wsse).setText(username)
    passwd = Element('Password', ns=wsse).setText(password)

    # Add Username and Password elements to UsernameToken element
    usernametoken.insert(uname)
    usernametoken.insert(passwd)

    security.insert(usernametoken)
    return security
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!它还解决了我的 suds wsse 支持和密码元素上缺少 type 属性的问题(使用 passwd.set('Type', "http://docs.oasis-open.org/wss/2004/01/oasis-200401 -wss-username-token-profile-1.0#PasswordText") 例如设置属性。 (3认同)