2017-06-20 146 views
1

我正在尝试创建一个消费WSDL文件并生成适当的SOAP消息的客户端。 这是我如何创建客户端:如何添加时间戳签名与zeep?

client = Client(
     wsdl=wsdl 
     ,transport = transport 
     ,wsse = Signature('key.pem', 'cert.pem') 
    ) 

在ZEEP代码中的注释说,它应该产生XML类似于此:

<soap:Header> 
    <wsse:Security mustUnderstand="true"> 
     <wsu:Timestamp> 
     <wsu:Created>2015-06-25T21:53:25.246276+00:00</wsu:Created> 
     <wsu:Expires>2015-06-25T21:58:25.246276+00:00</wsu:Expires> 
     </wsu:Timestamp> 
    </wsse:Security> 
    </soap:Header> 

但是它不添加mustUnderstand属性和TimeStamp是空白。有没有人有一个想法如何确保这些领域设置正确?

+0

wsdl在其他地方定义,只是一个本地wsdl文件的路径 – andrei

回答

2
 

    from datetime import datetime, timedelta 
    from lxml import etree 
    from zeep import Client 
    from zeep.wsse import utils 
    from zeep.plugins import HistoryPlugin 

    # Справочники 
    wsdl = 'http://claim-test2.isb.az:8903/cib/svc/wsdl/codetable.wsdl' 
    username, password = 'ws', '********' 
    bussines_user = '********' 


    class UsernameTokenTimestamp: 
     def __init__(self, username, password=None): 
      self.username = username 
      self.password = password 

     def apply(self, envelope, headers): 
      security = utils.get_security_header(envelope) 

      created = datetime.now() 
      expired = created + timedelta(seconds=5 * 60) 

      token = utils.WSSE.UsernameToken() 
      token.extend([ 
       utils.WSSE.Username(self.username), 
       utils.WSSE.Password(self.password), 
       utils.WSSE.Nonce('43d74dda16a061874d9ff27f2b40e017'), 
       utils.WSSE.Created(utils.get_timestamp(created)), 
      ]) 

      timestamp = utils.WSU('Timestamp') 
      timestamp.append(utils.WSU('Created', utils.get_timestamp(created))) 
      timestamp.append(utils.WSU('Expires', utils.get_timestamp(expired))) 

      security.append(timestamp) 
      security.append(token) 

      # 
      # headers['Content-Type'] = 'application/soap+xml;charset=UTF-8' 

      return envelope, headers 

     def verify(self, envelope): 
      pass 


    history = HistoryPlugin() 
    client = Client(
     wsdl=wsdl, 
     wsse=UsernameTokenTimestamp(username=username, password=password), 
     plugins=[history] 
    ) 

+0

P.S.扩展类签名并覆盖方法“apply”。 – dibrovsd