DocuSign JWT 模拟问题

Posted

技术标签:

【中文标题】DocuSign JWT 模拟问题【英文标题】:DocuSign JWT Impersonation Issues 【发布时间】:2021-02-02 00:30:34 【问题描述】:

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

现有流程

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

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

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

问题

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


  "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 来自模拟调用。

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

我在这里错过了什么?

【问题讨论】:

您可以将此令牌与任何其他端点一起使用吗? 没有,我试过好几次了 第 3 步中的令牌呢?你试过那个令牌吗?您不需要使用 JWT 以及 Auth Code Grant。您需要/或 【参考方案1】:

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

第 3 步中的令牌应该可以工作(但您可以省略“模拟”,因为授权代码授予不需要它)。

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

【讨论】:

事实证明,我在构建 JWT 时使用了错误的 ID。我使用的是用户帐户之一的 ID,而不是他们的***帐户 ID。这解决了它。【参考方案2】:

在这种特殊情况下,问题在于我在构建 JWT 时为 sub 值使用了错误的 ID。

我正在使用的oauth/userinfo 端点的结果返回结构为与帐户存储桶相关联的***用户 ID。我使用了其中一个存储桶中的帐户 ID,而不是***用户 ID。

【讨论】:

以上是关于DocuSign JWT 模拟问题的主要内容,如果未能解决你的问题,请参考以下文章

DocuSign:在 JWT 令牌中设置过期 - 始终获取一小时过期的访问令牌

DocuSign 获取 JWT 令牌 MEAN Stack

DocuSign JWT 访问令牌无效

DocuSign JWT 访问令牌请求

需要 DocuSign JWT 身份验证 .p12 而不是 PEM

使用 Jwt Oauth2 授权的 Docusign 嵌入式签名,无需客户登录/同意