【问题标题】:"no_valid_keys_or_signatures" Error Calling DocuSign API through Java SDK for OAuth 2.0 Authentication“no_valid_keys_or_signatures”通过 Java SDK 调用 DocuSign API 进行 OAuth 2.0 身份验证时出错
【发布时间】:2022-04-20 04:51:36
【问题描述】:

我正在将我们应用程序的身份验证方法升级到 DocuSign API,从 DocuSign 传统身份验证升级到 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"} ' 在 com.docusign.esign.client.ApiClient.requestJWTUserToken(ApiClient.java:866)

我正在从 DocuSign 演示环境执行此操作,并且正在使用 docusign-esign-java jar - 版本 3.12.0。这是显着的代码sn-p:

    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。这个过程是成功的。

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

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

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

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

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

有人能解释一下我可能做错了什么吗?

非常感谢任何帮助!

【问题讨论】:

    标签: java oauth-2.0 docusignapi


    【解决方案1】:

    在与同事进行了更多讨论并检查了快速启动应用程序后,问题变得相当简单。如果您查看我上面的代码 sn-p,您会看到:

    final ApiClient apiClient = new ApiClient();
    

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

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

    前进!

    【讨论】:

      【解决方案2】:

      在我的情况下,我已经从网站 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. 选择“发布”
      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 的 generate 值

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 2014-11-09
          • 1970-01-01
          • 2013-03-19
          • 2021-01-16
          • 1970-01-01
          • 2014-05-11
          相关资源
          最近更新 更多