"no_valid_keys_or_signatures" 通过 Java SDK 调用 DocuSign API 进行 OAuth 2.0 身份验证时出错

"no_valid_keys_or_signatures" Error Calling DocuSign API through Java SDK for OAuth 2.0 Authentication

我正在将应用程序的身份验证方法升级到 DocuSign API,从 DocuSign Legacy 身份验证升级到 JWT Grant OAuth 2.0 身份验证。

我在调用 Java SDK API 时收到以下错误:

Caused by: com.docusign.esign.client.ApiException: Error while requesting server, received a non successful HTTP code 400 with response Body: '{"error":"invalid_grant","error_description":"no_valid_keys_or_signatures"}' at com.docusign.esign.client.ApiClient.requestJWTUserToken(ApiClient.java:866)

我正在 DocuSign 演示环境中执行此操作并使用 docusign-esign-java jar - 版本 3.12.0。这是重要的代码片段:

    private OAuthToken getOAuthToken(final String integratorKey, final String userId, final String rsaPrivateKey) {

    final ApiClient apiClient = new ApiClient();
    OAuthToken oAuthToken = new OAuthToken();

    final List<String> scopes = Arrays.asList(Scope_SIGNATURE, Scope_IMPERSONATION);

    try {
        // call failing here on apiClient.requestJWTUserToken(...)
        oAuthToken = apiClient.requestJWTUserToken(integratorKey, userId, scopes, rsaPrivateKey.getBytes(), 10000);
    }
    catch (IllegalArgumentException | IOException e) {
        this.exceptionService.handleApiException("requestJWTUserToken", new ApiException(null, e, 500, null, null));
    }
    catch (final ApiException e) {
        this.exceptionService.handleApiException("requestJWTUserToken", e);
    }

    return oAuthToken;
}

现在,就参数而言,我在“应用程序和密钥”页面中为我的特定应用程序使用集成密钥:

就 userId 而言,我使用下面管理屏幕中与被视为应用程序用户的用户相关的 API 用户名:

请注意,我已按照上述特定用户的 instructions found here to request for application consent 进行操作。此过程成功。

关于范围参数,我正在传递签名和模拟范围,如代码片段所示。

至于 rsaPrivateKey 参数,我使用的是我在创建过程中复制的生成参数:

请注意,我在该屏幕上的用户应用程序身份验证方法是授权代码授予,我设置了重定向 URI,如图所示。

最后,最后一个参数是 JWT 断言时间,目前设置为 10000 秒。

现在,当我在调用失败行之前的断点处暂停时,我看到我的所有参数都按照上面解释的预期定义。

有人可以阐明我可能做错了什么吗?

非常感谢任何帮助!

在与同事进行更多讨论并检查快速启动应用程序之后,问题变得相当微不足道。如果您查看我上面的代码片段,您会看到:

final ApiClient apiClient = new ApiClient();

如前所述,我正在演示环境中进行尝试。好吧,显然默认构造函数使用 Prod basePath 填充 ApiClient 对象中的 basePath...因此 ApiClient 设置了错误的 basePath 属性。如果我更改上面的行以使用演示环境中的 basePath 实例化 ApiClient(从 java 属性 中提取),那么一切都很好:

final ApiClient apiClient = new ApiClient(this.docusignProperties.getRestApiUrl());

前进!

就我而言,我已经从网站 jwt.io 生成了 JWT 令牌,但我一直遇到错误 no_valid_keys_or_signatures,经过多次测试我发现了错误:

对于“exp”,我将纪元 (https://www.epochconverter.com/) 值设置得太及时(2050 年)

{
"iss":"ea670856-xxxx-xxxx-xxxx-80560d323639",
"sub":"917c9fc5-xxxx-xxxx-xxxx-87e7ede3b8ac",
"aud":"account-d.docusign.com",
"iat": 1628496664,
"exp": 1912493464,
"scope":"signature impersonation"
}

在邮递员中我使用以下参数:

  1. Select “Post”
  2. 输入 API 值:https://account-d.docusign.com/oauth/token
  3. 点击“正文”部分
  4. 添加密钥grant_type
  5. 为键 grant_type 添加值 urn:ietf:params:oauth:grant-type:jwt-bearer
  6. 添加密钥assertion
  7. 在前面的步骤中添加来自站点 jwt 的生成值

在我尝试使用从演示转移到生产的集成后,我收到了 DocuSign 的 401 错误(我的状态不是 400)。我错过了更新产品 url 的“aud”值。像这样的小事真的很容易错过。