代码之家  ›  专栏  ›  技术社区  ›  roeland

使用python zeep在anytype中创建复杂类型的soap消息

  •  6
  • roeland  · 技术社区  · 7 年前

    我需要创建一个包含以下内容的soap消息:

    <saml:Subject>     
        <saml:SubjectConfirmation>      
          <saml:ConfirmationMethod>
                   urn:oasis:names:tc:SAML:1.0:cm:holder-of-key
          </saml:ConfirmationMethod>
          <saml:SubjectConfirmationData>
             <saml:Assertion AssertionID="123" 
                             IssueInstant="2018-12-27T17:59:36.284Z" 
                             Issuer="issuer" 
                             MajorVersion="1" 
                             MinorVersion="1">
                ...
             </saml:Assertion>
          </saml:SubjectConfirmationData>
       </saml:SubjectConfirmation>
    </saml:Subject>
    

    SubjectConfirmationData 属于类型 AnyType 是的。
    我马上就要到了:

    assertion_type = client.get_type("saml:AssertionType")
    assertion = assertion_type(
        AssertionID = "123",
        MajorVersion = 1,
        MinorVersion = 1,
        Issuer = "issuer",
        IssueInstant = datetime.now())
    
    subject_confirm = {
        'ConfirmationMethod': 'urn:oasis:names:tc:SAML:1.0:cm:holder-of-key',
        'SubjectConfirmationData': assertion
    }
    
    result = {
        'Subject': {
            'SubjectConfirmation': subject_confirm
        }
    }
    

    结果是:

    <saml:Subject>
      <saml:SubjectConfirmation>
        <saml:ConfirmationMethod>
              urn:oasis:names:tc:SAML:1.0:cm:holder-of-key
        </saml:ConfirmationMethod>
        <saml:SubjectConfirmationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            MajorVersion="1" 
            MinorVersion="1" 
            AssertionID="123" 
            Issuer="issuer" 
            IssueInstant="2018-12-31T13:10:00.471365"
            xsi:type="saml:AssertionType"/>
      </saml:SubjectConfirmation>
    </saml:Subject>
    

    问题是 AssertionType 需要单独包装 Assertion 元素而不是内部 主题确认数据 是的。 如何添加此额外元素?

    更新1 :我也尝试过类似的操作,但出现错误:

    assertion_elem = client.get_element("saml:Assertion")
    assertion = assertion_elem(
        AssertionID = "",
        MajorVersion = 1,
        MinorVersion = 1,
        Issuer = cert_subject,
        IssueInstant = datetime.now())
    
    subj_conf_data_type = client.get_element("saml:SubjectConfirmationData")
    subj_conf_data = xsd.AnyObject(assertion_elem, assertion)
    
    subject_confirm = {
        'ConfirmationMethod': 'urn:oasis:names:tc:SAML:1.0:cm:holder-of-key',
        'SubjectConfirmationData': subj_conf_data,
        "KeyInfo": key_info
    }
    

    这是错误:

      File "...lib\site-packages\zeep\xsd\types\any.py", line 26, in render
        value.xsd_type.render(parent, value.value, None, render_path)
    TypeError: render() takes from 3 to 4 positional arguments but 5 were given
    

    更新2 :

    我也试过,但后来我得到了一个奇怪的结果:

    assertion_elem = client.get_element("saml:Assertion")
    assertion = assertion_elem(
        AssertionID = "",
        MajorVersion = 1,
        MinorVersion = 1,
        Issuer = cert_subject,
        IssueInstant = datetime.now())
    
    subject_confirm = {
        'ConfirmationMethod': 'urn:oasis:names:tc:SAML:1.0:cm:holder-of-key',
        'SubjectConfirmationData': {
            'Assertion': assertion
        },
        "KeyInfo": key_info
    }
    

    结果是:

    <saml:Subject>
              <saml:SubjectConfirmation>
                <saml:ConfirmationMethod>
                    urn:oasis:names:tc:SAML:1.0:cm:holder-of-key
                </saml:ConfirmationMethod>
                <saml:SubjectConfirmationData>{'Assertion': {
        'Conditions': None,
        'Advice': None,
        '_value_1': {
    },
        'Signature': None,
        'MajorVersion': 1,
        'MinorVersion': 1,
        'AssertionID': '123',
        'Issuer': 'issuer',
        'IssueInstant': datetime.datetime(2018, 12, 31, 15, 2, 8, 518253)
    }}</saml:SubjectConfirmationData>
              </saml:SubjectConfirmation>
            </saml:Subject>
    

    更新3:

    我通过在一个自定义的zeep插件中创建完整的头来解决这个问题。
    头文件是用普通的lxml创建的,并用xmlsec签名

    0 回复  |  直到 7 年前