首页 > 解决方案 > DocuSign JWT 模拟问题

问题描述

我正在研究此处此处记录的 JWT 模拟流程。我正在使用 C#,虽然我已经完成了一些快速启动应用程序,但我仍然遇到了一些问题。

现有流程

到目前为止,似乎在 DS sandbox/dev/demo 中可以使用的流程是:

  1. 将用户发送到 DocuSign ( oauth/auth)。scope"signature impersonation"。(我也尝试过添加更多权限。)
  2. 在 DS 身份验证和模拟授权后,用户在我的网络应用程序上显示了一个授权码
  3. 获取该授权码并将其发布oauth/token以获取我的目标用户的访问令牌
  4. 获取该访问令牌并调用oauth/userinfo以获取目标用户的 ID 和 URL
  5. 创建一个 JWT,使用我的 Web 应用程序和 DS 之间的共享密钥对进行签名,然后将其发布到oauth/token. 收到200带有看起来不错的令牌的响应。

到目前为止,这一切似乎都正常工作:所有 DS 调用都返回200s 和数据,这些数据的形状与我预期的一样。

问题

问题是我实际上无法从最后一步成功使用该令牌作为我的应用程序所模拟的用户执行进一步的操作。(我确保将base_url用于关联用户。)当我GET从建议的端点(brands)请求 a 时,我收到了这个回复:

{
  "errorCode": "AUTHORIZATION_INVALID_TOKEN",
  "message": "The access token provided is expired, revoked or malformed. Authentication for System Application failed."
}

提供授权令牌的响应包含expires_in数千秒的值,我正在我的 Web 应用程序中串行执行所有这些请求。因此,此时不应到期或撤销。我也根本没有碰过令牌,所以我希望它的格式很好。

这是我用来发布到该端点的代码,如果它有用的话:

private async Task<IgnoreMe> GetBrands(UserInfoAccount account, AccessTokenResponse accessToken)
{
    var client = _clientFactory.CreateClient("docusign");

    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = new Uri($"{account.BaseUri}/restapi/v2.1/accounts/{account.Id}/brands"),
    };
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken!);
    
    var response = await client.SendAsync(request);
    if (!response.IsSuccessStatusCode)
    {
        return IgnoreMe.Fail;
    }
    return IgnoreMe.Succeed;
}

此方法的参数是从以前的 API 调用返回的值:AccessTokenResponse来自模拟调用。

我还尝试向其他几个顶级用户/帐户端点发送类似的请求,并且都收到了相同或类似的错误。

我在这里想念什么?

标签: c#docusignapi

解决方案


如果 Auth Code Grant 和 JWT,您的流程是混合的。您正在使用两者。

步骤 3 中的令牌应该可以工作(但您可以省略“模拟”,因为 Auth Code Grant 不需要它)。

令牌在 8 小时后过期。这可能是您错误的原因。您需要获得一个新的。


推荐阅读