DocuSign、Node SDK、JWT 身份验证、信封获取、“自定义错误模块无法识别此错误。”

use*_*540 5 docusignapi

[最终更新] 根据此线程修复:https://github.com/docusign/docusign-esign-node-client/issues/295

显然与 DocuSign 的 API 的安全添加相关。


今天之前我还没有遇到过这个问题。上周我向客户提供了一个演示,相同的代码运行良好。今天我得到以下信息:

{
    "status": 444,
    "response": {
        "req": {
            "method": "GET",
            "url": "https://demo.docusign.net/restapi...",
            "data": {},
            "headers": {
                "user-agent": "node-superagent/3.8.2",
                "x-docusign-sdk": "Node",
                "authorization": "Bearer ABC...",
                "content-type": "application/json",
                "accept": "application/json"
            }
        },
        "header": {
            "content-type": "text/html",
            "x-docusign-tracetoken": "2eeb8caa-8865-4898-bef9-d3611bfaa3f7",
            "x-docusign-node": "DA2DFE5",
            "date": "Fri, 17 Jun 2022 01:02:02 GMT",
            "content-length": "54",
            "connection": "close",
            "strict-transport-security": "max-age=31536000; includeSubDomains"
        },
        "status": 444,
        "text": "The custom error module does not recognize this error."
    }
}
Run Code Online (Sandbox Code Playgroud)

通过节点 SDK,我使用 获取令牌requestJWTUserToken,并设置 apiclient 的 auth 标头,然后新建一个 EnvelopesAPI 实例。当我致电getEnvelope()listStatusChanges()时,我收到上述错误。这些代码在几个月内都没有发生任何变化,而且我使用相同的集成密钥、帐户、私钥,一切。我已经演示过几次了 - 没有问题。

一个有趣的观察:上面的错误给了我一个 URL 和令牌。该令牌是有效的,如果我envelopes使用该令牌通过 Postman 向 URL(端点)发出请求,则请求会成功。所以我通过 SDK 的调用似乎由于某种原因失败了。

我似乎无法破解这个问题,而且现在我无法绕过它,因为有几个上周才工作的演示系统。

我正在使用 docusign-esign 5.17 模块 - 从 5.15 升级,试图解决该问题。没有运气。

这个错误从何而来?

[更新1]

我正在运行我的节点应用程序,该应用程序通过 DocuSign Node SDK 针对代理发出请求,以便我可以看到失败的请求实际上是什么样子:

请求失败

他们以同样的方式失败。

HTTP/1.1 444 
Content-Type: text/html
X-DocuSign-TraceToken: 338534c6-c8c3-4b01-9b66-35d697cd0053
X-DocuSign-Node: DA1DFE4
Date: Fri, 17 Jun 2022 03:55:07 GMT
Content-Length: 54
Vary: Accept-Encoding
Connection: close
Strict-Transport-Security: max-age=31536000; includeSubDomains

The custom error module does not recognize this error.
Run Code Online (Sandbox Code Playgroud)

我使用 Proxyman 来捕获请求,与 Chrome 或 Firefox 一样,它可以让您将请求复制为 cURL 命令。如果我将失败的请求复制为 cURL,然后在终端运行,它就会成功。


[MacBookPro0020]~/source/docusign/jwt-smoke-test:0 (master)
$ curl 'https://demo.docusign.net/restapi/v2.1/accounts/a0a4c81f-.../envelopes?envelope_ids=e750526f-...&envelope_ids=a38b794b...&envelope_ids=a5d8c586-...' \
-H 'Host: demo.docusign.net' \
-H 'User-Agent: node-superagent/3.8.2' \
-H 'X-DocuSign-SDK: Node' \
-H 'Node-Ver: v14.18.3' \
-H 'Authorization: Bearer ABCD...' \
-H 'Accept: application/json' \
-H 'Connection: close' \
-H 'Content-Type: application/json' \
--proxy http://localhost:9090
{"resultSetSize":"1","startPosition":"0","endPosition":"0","totalSetSize":"1","nextUri":"","previousUri":"","envelopes":[{"status":"created","documentsUri":"/envelopes/d97565c8...purgeState":"unpurged","envelopeIdStamping":"true","autoNavigation":"true","isSignatureProviderEnvelope":"false","allowComments":"true","anySigner":null,"envelopeLocation":"current_site"}]}

Run Code Online (Sandbox Code Playgroud)

我正在使用 JWT 身份验证令牌,因此我再次获得了有效令牌。通过 SDK 的调用始终失败,但通过 Postman 进行 cURL 和手动请求均会成功。

我不知所措。

其他详细信息:我在 MacOS 和 Windows 上看到了同样的问题(即托管 docusign-esign 的节点应用程序)。我正在使用授权代码授予发送信封并查询信封状态,效果很好。直到本周我都没有出现任何问题地使用 JWT Grant(上周刚刚演示了自动化功能并且它起作用了。)我没有对我的 DocuSign 功能进行任何代码更改,我的同事也没有,至少根据存储库的历史。

我不记得以前遇到过上述错误。我很想知道为什么 cURL'ing 相同的请求会成功。我不想放弃 SDK 并提出我自己的请求,但这并不困难。

[更新2]

这是一个简单的重现 - 它是 Node SDK 的 QuickStart 演示项目的快速而肮脏的副本。我只使用 docusign-esign。

精确的。相同的。问题。

同样,我可以将该令牌放入 cURL 或 postman 中,请求就会成功。这里没有太多代码。令牌有效。

async function main() {
    // Data used
    // dsConfig.dsClientId
    // dsConfig.impersonatedUserGuid
    // dsConfig.privateKey
    // dsConfig.dsOauthServer

    let dsConfig = dsConfig_customer; // defined globally

    const jwtLifeSec = 10 * 60, // requested lifetime for the JWT is 10 min
        dsApi = new docusign.ApiClient();

    dsApi.setOAuthBasePath(dsConfig.dsOauthServer.replace('https://', '')); // it should be domain only.

    const results = await dsApi.requestJWTUserToken(dsConfig.dsClientId,
        dsConfig.impersonatedUserGuid, 'signature impersonation', dsConfig.privateKey,
        jwtLifeSec);

    console.log( results.body.access_token );

    const userInfo = await dsApi.getUserInfo(results.body.access_token);

    dsApi.setBasePath(userInfo.accounts[0].baseUri + '/restapi');
    dsApi.addDefaultHeader( 'Authorization', 'Bearer ' + results.body.access_token );
    const envelopesAPI = new docusign.EnvelopesApi(dsApi);
    const res = await envelopesAPI.getEnvelope( dsConfig.accountID, 'e1917111-2900-48e8-9054-799169379c8a', null );
    console.log(res);

    return {
        accessToken: results.body.access_token,
        tokenExpirationTimestamp: expiresAt,
        userInfo,
        account: userInfo.accounts[0]
    };
}

main().then(result => console.log(result)).catch(err=>console.error(err));

Run Code Online (Sandbox Code Playgroud)
...
    header: {
      'content-type': 'text/html',
      'x-docusign-tracetoken': '685b6226-a0d3-4547-94c7-df0216d884a3',
      'x-docusign-node': 'DA2DFE188',
      date: 'Fri, 17 Jun 2022 05:20:12 GMT',
      'content-length': '54',
      vary: 'Accept-Encoding',
      connection: 'close',
      'strict-transport-security': 'max-age=31536000; includeSubDomains'
    },
    statusCode: 444,
    status: 444,
    statusType: 4,
    info: false,
    ok: false,
    redirect: false,
    clientError: true,
    serverError: false,
    error: Error: cannot GET /restapi/v2.1/accounts/49754554-ABCD-.../envelopes/e1917111-2900-48e8-9054-799169379c8a (444)
...
Run Code Online (Sandbox Code Playgroud)

Jeu*_*nti 1

Docusign SDK NodeJS我最终设法通过将文件中的版本从 5.15.0降级到 5.7.0 来解决该问题package.json

与此相关的问题可以在那里找到,我真的希望这个问题能尽快得到解决。

编辑 :

Docusign 支持实际上对此采取了行动(上面的 github 问题现已关闭),使用最新版本Docusign SDK NodeJS(或您之前使用的版本)再次测试可能会很有趣。