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

ris*_*ide 5 java oauth-2.0 docusignapi

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

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

原因:com.docusign.esign.client.ApiException:请求服务器时出错,收到不成功的 HTTP 代码 400,响应正文:'{"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;
}
Run Code Online (Sandbox Code Playgroud)

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

DocuSign 演示应用程序和密钥

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

DocuSign 演示用户

请注意,我已按照此处的说明请求上述特定用户的应用程序同意。这个过程是成功的。

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

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

DocuSign 演示特定应用程序

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

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

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

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

任何帮助是极大的赞赏!

ris*_*ide 1

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

final ApiClient apiClient = new ApiClient();
Run Code Online (Sandbox Code Playgroud)

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

final ApiClient apiClient = new ApiClient(this.docusignProperties.getRestApiUrl());
Run Code Online (Sandbox Code Playgroud)

向前!