DocuSign JWT 模拟问题
DocuSign JWT Impersonation Issues
我正在研究记录在案的 JWT 模拟流程 here and here。我正在使用 C#,虽然我已经完成了一些快速启动应用程序,但我仍然遇到一些问题。
现有流程
我目前的流程似乎在 DS sandbox/dev/demo 中有效,是:
- 将用户发送到 DocuSign (
oauth/auth
)。 scope
是 "signature impersonation"
。 (我也尝试过添加更多权限。)
- DS 身份验证和模拟授权后,用户在我的 Web 应用程序上显示了授权码
- 获取该授权码并post它到
oauth/token
为我的目标用户获取访问令牌
- 获取该访问令牌并调用
oauth/userinfo
以获取目标用户的 ID 和 URL
- 创建一个 JWT,使用我的 Web 应用程序和 DS 之间的共享密钥对进行签名,然后 post 它到
oauth/token
。收到一个 200
回复,带有一个看起来不错的令牌。
到目前为止这一切似乎都正常工作:所有 DS 调用返回 200
s 和数据,其形状符合我的预期。
问题
问题是我实际上无法成功地使用最后一步中的该令牌作为我的应用程序正在模拟的用户执行进一步的操作。 (我确定对关联用户使用 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 应用程序中连续执行所有这些请求。因此,过期或撤销 应该 在这一点上是不可能的。我也根本没有碰过令牌,所以我希望它的格式正确。
这是我用来 post 到那个端点的代码,如果它有用的话:
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
来自模拟调用。
我也尝试向其他几个顶级 user/account 端点发送类似的请求,并且都收到了相同或相似的错误。
我在这里错过了什么?
您的流程混合了授权代码授权和 JWT。您正在使用两者。
第 3 步中的令牌应该有效(但您可以省略“模拟”,因为授权代码授予不需要它)。
令牌将在 8 小时后过期。这可能是您错误的原因。您需要获得一个新的。
在这种特殊情况下,问题是我在构建 JWT 时为 sub
值使用了错误的 ID。
我使用的 oauth/userinfo
端点的结果返回结构化为与一桶帐户相关联的顶级用户 ID。我使用了其中一个存储桶中的帐户 ID,而不是顶级用户 ID。
我正在研究记录在案的 JWT 模拟流程 here and here。我正在使用 C#,虽然我已经完成了一些快速启动应用程序,但我仍然遇到一些问题。
现有流程
我目前的流程似乎在 DS sandbox/dev/demo 中有效,是:
- 将用户发送到 DocuSign (
oauth/auth
)。scope
是"signature impersonation"
。 (我也尝试过添加更多权限。) - DS 身份验证和模拟授权后,用户在我的 Web 应用程序上显示了授权码
- 获取该授权码并post它到
oauth/token
为我的目标用户获取访问令牌 - 获取该访问令牌并调用
oauth/userinfo
以获取目标用户的 ID 和 URL - 创建一个 JWT,使用我的 Web 应用程序和 DS 之间的共享密钥对进行签名,然后 post 它到
oauth/token
。收到一个200
回复,带有一个看起来不错的令牌。
到目前为止这一切似乎都正常工作:所有 DS 调用返回 200
s 和数据,其形状符合我的预期。
问题
问题是我实际上无法成功地使用最后一步中的该令牌作为我的应用程序正在模拟的用户执行进一步的操作。 (我确定对关联用户使用 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 应用程序中连续执行所有这些请求。因此,过期或撤销 应该 在这一点上是不可能的。我也根本没有碰过令牌,所以我希望它的格式正确。
这是我用来 post 到那个端点的代码,如果它有用的话:
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
来自模拟调用。
我也尝试向其他几个顶级 user/account 端点发送类似的请求,并且都收到了相同或相似的错误。
我在这里错过了什么?
您的流程混合了授权代码授权和 JWT。您正在使用两者。
第 3 步中的令牌应该有效(但您可以省略“模拟”,因为授权代码授予不需要它)。
令牌将在 8 小时后过期。这可能是您错误的原因。您需要获得一个新的。
在这种特殊情况下,问题是我在构建 JWT 时为 sub
值使用了错误的 ID。
我使用的 oauth/userinfo
端点的结果返回结构化为与一桶帐户相关联的顶级用户 ID。我使用了其中一个存储桶中的帐户 ID,而不是顶级用户 ID。