无法使用 DocuSign Python 代码生成 jwt 令牌

Posted

技术标签:

【中文标题】无法使用 DocuSign Python 代码生成 jwt 令牌【英文标题】:Unable to generate a jwt token using DocuSign Python code 【发布时间】:2020-06-23 02:00:42 【问题描述】:

我正在使用 docusign 进行数字签名,我必须在其中创建一个 jwt 令牌。为此,我一直在使用来自 git repo https://github.com/docusign/docusign-python-client 的代码。

docusign 3.1.0 版、python 3.5 版和 3.6 版沙盒模式。 出现以下错误 raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='https', port=443): 最大重试次数超过了 url http://account-d.docusign.com/oauth/token (由 NewConnectionError(': 无法建立新连接: [Errno -2] 名称或服务不已知',))

我已使用以下 url JSON Web Token (JWT) Grant 跟踪 curl 请求

得到一个应用程序令牌,并在传递身份验证时给我 401(401 UNAUTHORIZED ) 错误 邮递员

claim = "iss": '4556e2f7-4a3d-41f9-a0c3-18535a28ab2a', "aud": 'account-d.docusign.com', "iat": 现在, "exp": 稍后, "范围": " ".join(scopes) token = jwt.encode(payload=claim, key=pkey, algorithm='RS256').decode("utf-8") 我使用上面的代码获取应用程序令牌,但是当我传递所有必需的参数时,我得到了 "error":"invalid_grant","error_description":"no_valid_keys_or_signatures" 但是当我将 jwt 令牌粘贴到 jwt.io 中时,我的 public 和 privte密钥说签名已验证。

我添加了屏幕截图的链接,这也可能有助于更多地了解问题。 https://ibb.co/2yKXNCWhttps://ibb.co/cFTk6R1https://ibb.co/t3YMkr2

【问题讨论】:

【参考方案1】:

这个概念是生成一个包含 3 个元素的密钥(标头 RS256 算法,包含应用程序日期和令牌有效性的有效负载数据以及私钥和公钥。我们将在网站 jwt.io 上放置所有这些信息和网站将重新设计一个 Base64 密钥,我们可以进一步输入

打开 JWT.IO 站点 jwt.io

    在顶部选择算法 RS256

对于第二个窗格:“有效负载:数据”

https://admindemo.docusign.com/apps-and-keys

问题:

应用程序的集成密钥(也称为客户端 ID)。

sub :要模拟的用户的用户 ID。 (授予权限的人必须拥有 DocuSign 用户帐户。) 提供的用户 ID 必须是 GUID(不是电子邮件)格式。您可以使用 users.list 方法从他们的电子邮件中查找用户的 GUID。 注意:如果您还没有要代表的用户的用户 ID,您可以通过完成在请求授权码步骤中开始的授权码授予流程来获取它。

https://admindemo.docusign.com/apps-and-keys -> 应用程序和密钥 ->

aud :要使用的身份验证服务实例的 URI。 对于演示环境,请使用 account-d.docusign.com。 对于生产环境,请使用 account.docusign.com。

重要提示:不要在 aud 值中包含 https://!

iat : 发布 JWT 的日期时间 以 Unix 纪元格式。创建 JWT 时必须包含 iat 值,通常设置为当前时间。

您可以使用以下链接将日期转换为 linux 纪元格式:https://www.epochconverter.com/

exp:JWT 断言到期的日期时间

Unix 纪元格式。从 iat 的值默认为一小时,不能设置为更大的值。创建 JWT 时必须包含 exp 值。 使用纪元https://www.epochconverter.com/

⚠ 请注意,此值不能太及时,在我们的示例中,我们使用 14 年的有效期。

scope :要请求的范围。在我们的示例“签名模拟”中。 所有范围都定义在以下站点https://developers.docusign.com/platform/auth/reference/scopes/

"iss":"ea670856-0422-4d8e-99bd-80560d323639", “子”:“917c9fc5-d615-43bb-8a28-87e7ede3b8ac”, "aud":"account-d.docusign.com", "iat": 1628496664, “exp”:1912493464, “范围”:“签名模拟”

对于“验证签名”窗格 https://admindemo.docusign.com/apps-and-keys -> 操作 -> 编辑

... -> 点击“生成 RSA”

选择公众并将其粘贴到部分

并为公钥做同样的事情。如果一切正常,您必须在文档左侧有“签名验证”标签,见下图。

在最后一步,您获得使用 API 声明的密钥

去找邮递员

    https://www.postman.com/use-cases/api-testing-automation/

    登录(使用我的 Google 帐户登录)

    您必须填写以下值

    选择“发布”

    输入 API 值:https://account-d.docusign.com/oauth/token

    点击“正文”部分

    添加键“grant_type”

    为键“grant_type”添加值“urn:ietf:params:oauth:grant-type:jwt-bearer”

    添加键“断言”

    在前面的步骤中添加来自站点 jwt 的生成值

    最后点击发送以获得进一步调用所需的“access_token”。 [在此处输入图片说明][1]

【讨论】:

【参考方案2】:

以下是您必须确保的事项:

    您的集成密钥 (clientID) 配置正确。

    您有一个 RSA 私钥。该密钥被完全复制/粘贴到您的配置文件中。必须保留新行

    您的 URL 与环境匹配。这意味着您将 account-d 和 demo.docusign.net 用于沙盒环境端点。

    您需要 userId,它是要被模拟的用户的 GUId。该用户必须同意该应用程序。您必须确保传递的是 userId 而不是 accountId,并且它与您将使用的帐户相同。

如果您确认所有这些但仍然收到错误 - 我会考虑使用我们的代码示例开始。我没有在您的问题中看到代码,但我们的代码示例应该是一个很好的开始方式。

【讨论】:

以上是关于无法使用 DocuSign Python 代码生成 jwt 令牌的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中的 DocuSign 中获取令牌

无法使用DocuSign管理API更新用户资料 [docusignapi] 。

DocuSign - 动态模板结构

DocuSign JWT 访问令牌请求

Docusign REST API无法启动

DocuSign与Drawloop Document Generation一起使用