带有 Zeep 和 Python 的 SOAP 客户端中的不记名令牌授权标头

Posted

技术标签:

【中文标题】带有 Zeep 和 Python 的 SOAP 客户端中的不记名令牌授权标头【英文标题】:Bearer Token authorization header in SOAP client with Zeep and Python 【发布时间】:2018-12-06 17:04:38 【问题描述】:

我是 SOAP 请求和一般编程的新手。我想访问需要持有者令牌授权才能使用其服务之一的 WSDL。

调用pyhton -mzeep *WSDL_url*后我想访问的服务信息:

  getInfo(param1: xsd:string, param2: xsd:anySimpleType, param3: xsd:anySimpleType) -> out: ns0:ResponseCurve[]

首先我收到令牌:

import zeep
user = 'my_user'
userpass = 'my_pass'
token = client.service.getAuthToken(user,userpass)

那我想请求需要三个参数的服务getInfo:

my_info = client.service.getInfo('param1', 'param2', 'param3')

我知道提供商每次想要访问此服务时都需要令牌,并且在文档中说明了有关身份验证的标头:

授权:承载 eyJhbGciOiJIUzI1N[...]

我试图在_soapheaders 中将标题作为dict 传递,但不起作用。

我可以通过强制请求访问服务:

def get_response_from_provider(token, param1, param2, param3):
    url = "WSDL url"
    headers = 'Authorization': 'Bearer ' + token,
               'content-type': 'text/xml'
    body = """
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsl="uri">
        <soapenv:Header/>
        <soapenv:Body>
            <wsl:getInfo>
                <param1>""" + param1 + """</param1>
                <param2>""" + param2 + """ </param2>
                <param3>""" + param3 + """ </param3>
            </wsl:getInfo>
        </soapenv:Body>
    </soapenv:Envelope>"""
    response = requests.post(url, data=body, headers=headers)
    print("Info recieved...")

    return response

但是我想通过 SOAP 客户端访问服务。

这是他们在 php 中添加令牌的方式:

$soap->soapClient->_stream_context = stream_context_create([
    'http' => [
        'header' => sprintf('Authorization: Bearer %s', $authTokenResponse->token)
    ]
]);

关于如何在 Python 中将带有 Token 的标头添加到客户端请求的任何想法?

我在 SOF 中看到过很多关于 SOAP+Python 的帖子,但无法解决问题。即使使用 Zeep 文档,我也无法使其工作。

谢谢

【问题讨论】:

xml请求返回500 【参考方案1】:

我想做类似的事情,结果发现它在文档中,但它有点隐藏,你可以在这里找到它:

https://python-zeep.readthedocs.io/en/master/settings.html#context-manager

简而言之,您可以执行以下操作:

import zeep

settings = zeep.Settings(extra_http_headers='Authorization': 'Bearer ' + token)
client = zeep.Client(wsdl=url, settings=settings)

【讨论】:

【参考方案2】:

我不确定为什么接受的答案对我不起作用,但这是我最终做的事情

import requests
from zeep import Client, Transport

headers = 
    "Authorization": "Bearer " + get_token()

session = requests.Session()
session.headers.update(headers)
transport = Transport(session=session)
client = Client(wsdl=url, transport=transport)

【讨论】:

以上是关于带有 Zeep 和 Python 的 SOAP 客户端中的不记名令牌授权标头的主要内容,如果未能解决你的问题,请参考以下文章

带有Zeep的Python SOAP客户端 - 导入命名空间

Python - Zeep SOAP 复杂标头

Soap 请求在 Soapui 中运行良好,但在 python 中运行良好 - ZEEP - SUDS

Python Zeep SOAP 客户端模块 - 无法为元素设置属性

[TimLinux] Python3 Coverity zeep/SOAP 库使用示例

我需要创建一个使用 ZEEP 或 REQUEST 模块调用 SOAP GET 方法的 python 脚本