获取“ INVALID_TOKEN_FORMAT安全令牌格式不符合预期的架构。” docusign旧版身份验证标头

时间:2019-06-10 20:23:22

标签: python docusignapi

我正在尝试使用Python请求编写请求,该请求会将请求发送到Docusign。我需要使用旧版授权标头,但不幸的是,似乎大多数与此相关的文档已被删除。当我发送请求时,出现标题中所述的错误。

从研究中,我发现密码中的特殊字符可能会导致此问题,因此,我确认密码中没有特殊字符,并且我的API密钥正确。我目前正在将标头作为字符串化字典发送,如下所示。我尝试了其他几种方法,这似乎是最接近的方法,但仍然会导致错误。我尝试过的其他方法包括尝试将标头作为单个字符串写出(首先不构成字典),但这似乎没有更好的效果。

docusign_auth_string = {}
docusign_auth_string["Username"] = docusign_user
docusign_auth_string["Password"] = docusign_password
docusign_auth_string["IntegratorKey"] = docusign_key

docusign_auth_string = str(docusign_auth_string)

headers = {'X-DocuSign-Authentication': docusign_auth_string}

response = requests.post(docusign_url, headers=headers, data=body_data)

上面的代码返回带有消息INVALID_TOKEN_FORMAT的401,“安全令牌格式不符合预期的架构。”我发送的标头如下所示: {'X-DocuSign-Authentication':“ {'Username':'test@test.com','Password':'xxxxxxxxxx','IntegratorKey':'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'}”}“ / p>

当我通过邮递员发送请求时,它工作正常。在邮递员中,我输入标题名称为X-Docusign-Authentication,并将值输入为:{“ Username”:“ {{ds_username}}”,“ Password”:“ {{ds_password}}”,“ IntegratorKey”:“ { {ds_integrator_key}}“}(减去与python代码相同的变量值)。

因此,它肯定与请求发送标头的方式有关。

有人知道为什么我会出现上述错误吗?

3 个答案:

答案 0 :(得分:1)

我能够重现此行为:看起来DocuSign不接受x-DocuSign-Authentication标头值的子参数周围的单引号。

您的示例失败:

{'Username': 'test@test.com', 'Password': 'xxxxxxxxxx', 'IntegratorKey': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'}

这有更多的成功:

{"Username": "test@test.com", "Password": "xxxxxxxxxx", "IntegratorKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}

我对Python不够熟悉,无法建议您是否可以使用双引号而不是单引号来遵循不同的代码结构。最坏的情况是,您可能需要手动设置“标题值”以遵循该格式。

答案 1 :(得分:1)

我找到了解决此问题的方法。提到双引号的响应是正确的,但是在Python中,我无法发送具有正确格式的字符串以使docusign能够理解。接下来,我发现以下堆栈溢出问题,最终提供了解决方案:

How to send dict in Header as value to key 'Authorization' in python requests?

我使用json.dumps并解决了该问题。我的代码如下:

docusign_auth_string = {}
docusign_auth_string["Username"] = docusign_user
docusign_auth_string["Password"] = docusign_password
docusign_auth_string["IntegratorKey"] = docusign_key

headers = {"X-DocuSign-Authentication": json.dumps(docusign_auth_string), "Content-Type": "application/json"}

答案 2 :(得分:0)

由于成功使用Postman,将有助于准确获取通过您的请求发送的内容。为此用途:

response = requests.get(your_url, headers=your_headers)
x = response.request.headers()
print(x)

这将向您确切显示正在准备和发送的请求。如果您在此处发布该响应,则id乐于提供更多帮助。

How can I see the entire HTTP request that's being sent by my Python application?

第二个答案显示了响应对象的所有可能参数。