返回

使用 Zeep 发送带有安全标头和时间戳的 SOAP 请求:深入指南

python

使用 Zeep 发送带有标头和时间戳的 SOAP 请求

作为一名经验丰富的程序员和技术作家,我经常与需要与基于 SOAP 的 Web 服务进行交互的开发人员合作。最近,我遇到一个常见的挑战,即使用 Zeep 库发送带有安全标头和时间戳的 SOAP 请求。本文将深入探讨解决此问题的步骤,提供详细的代码示例和明确的解释。

了解问题:标头和时间戳的必要性

在某些情况下,与 Web 服务进行交互时,需要包含安全标头和时间戳。这些元素对于身份验证、消息保护和确保请求的新鲜度至关重要。SoapUI 等工具通常可以轻松生成这些元素,但使用编程语言和库(如 Zeep)时,事情可能会变得复杂。

使用 Zeep 库发送标头和时间戳

第一步是初始化 Zeep 客户端并设置 WSSE 安全标头。WSSE(Web 服务安全扩展)是 SOAP 安全的标准,允许使用用户名令牌或其他身份验证机制。

from zeep.wsse.username import UsernameToken
from zeep.client import Client

client = Client(wsdl_url, wsse=user_name_token)

接下来,我们需要创建标头值,其中包含 SoapUI 示例中定义的 RequestContext 元素。

header_value = {
    'RequestContext': {
        'Id': 'whatever',
        'Language': 'fr'
    }
}

最后,将 header_value 设置为客户端的默认 SOAP 标头,以便在每个请求中自动包含它。

client.set_default_soapheaders([header_value])

使用时间戳提高安全性

时间戳对于防止重放攻击至关重要,它通过在请求中包含当前时间戳来确保消息的时效性。

from zeep.wsse.utils import WSU
import datetime

timestamp_token = WSU.Timestamp()
today_datetime = datetime.datetime.today()
expires_datetime = today_datetime + datetime.timedelta(minutes=5)

timestamp_elements = [
        WSU.Created(today_datetime.strftime("%Y-%m-%dT%H:%M:%S.%fZ")),
        WSU.Expires(expires_datetime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"))]

常见问题解答

Q1:如何在 SoapUI 中生成标头和时间戳?
A1:在 SoapUI 中,可以右键单击请求并选择“添加 WS-Security 配置”。这将生成一个配置对话框,允许你设置必要的安全标头和时间戳。

Q2:为什么我的 Zeep 请求在包含标头和时间戳时失败?
A2:确保时间戳是有效的,并且标头值与 SoapUI 示例中定义的值匹配。此外,检查 Web 服务是否要求任何特定的安全配置。

Q3:如何使用不同的身份验证机制?
A3:Zeep 支持多种身份验证机制,包括用户名令牌、X.509 证书和 Kerberos。根据 Web 服务的要求进行相应调整。

Q4:如何处理 SOAP 故障?
A4:Zeep 提供了处理 SOAP 故障的机制。你可以捕获 zeep.exceptions.Fault 异常并根据故障代码和详细消息采取适当的操作。

Q5:如何优化 SOAP 请求性能?
A5:可以使用各种技术来优化 SOAP 请求性能,例如使用 SOAP 附件、压缩和批处理请求。

结论

通过遵循本文中概述的步骤,你可以使用 Zeep 库有效地发送带有安全标头和时间戳的 SOAP 请求。了解 WSSE 标准、设置默认标头和使用时间戳对于确保请求的安全性和可靠性至关重要。希望这篇文章为你的 SOAP 开发工作提供了有价值的指导。