"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"
}
在邮递员中我使用以下参数:
- Select “Post”
- 输入 API 值:https://account-d.docusign.com/oauth/token
- 点击“正文”部分
- 添加密钥
grant_type
- 为键
grant_type
添加值 urn:ietf:params:oauth:grant-type:jwt-bearer
- 添加密钥
assertion
- 在前面的步骤中添加来自站点 jwt 的生成值
在我尝试使用从演示转移到生产的集成后,我收到了 DocuSign 的 401 错误(我的状态不是 400)。我错过了更新产品 url 的“aud”值。像这样的小事真的很容易错过。
我正在将应用程序的身份验证方法升级到 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"
}
在邮递员中我使用以下参数:
- Select “Post”
- 输入 API 值:https://account-d.docusign.com/oauth/token
- 点击“正文”部分
- 添加密钥
grant_type
- 为键
grant_type
添加值urn:ietf:params:oauth:grant-type:jwt-bearer
- 添加密钥
assertion
- 在前面的步骤中添加来自站点 jwt 的生成值
在我尝试使用从演示转移到生产的集成后,我收到了 DocuSign 的 401 错误(我的状态不是 400)。我错过了更新产品 url 的“aud”值。像这样的小事真的很容易错过。