【发布时间】:2018-07-11 02:13:27
【问题描述】:
我正在尝试按照docusign docs 此处的步骤实现“服务集成身份验证”,直到 请求访问令牌,您发送 jwt 令牌(格式正确)之前它都做得很好
我总是收到“invalid_grant”,根据该文档,是因为某些声明无效。该错误还有其他原因吗? 所有的声明看起来都不错
C#:
//request access token
var client3 = new RestClient("https://" + _host);
var request3 = new RestRequest("/oauth/token", Method.POST);
request3.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request3.AddParameter("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer");
var headers = new[]
{
new Claim("alg", "RS256"),
new Claim("typ", "JWT"),
}.ToList();
var claims = new[] {
new Claim("iss", _integrationKey), //<-- integration key
new Claim("sub", OAuthGrant.Sub), //<-- returned from /oauth/userinfo (OK)
new Claim("iat", ToUnixTime(DateTime.Now).ToString(), ClaimValueTypes.Integer64),
new Claim("exp", ToUnixTime(DateTime.Now.AddHours(1)).ToString(), ClaimValueTypes.Integer64),
new Claim("aud", _host), //<-- "account-d.docusign.com"
new Claim("scope", "signature"),
}.ToList();
//build jwt from private key. token decodes just fine from https://jwt.io/
var jwtToken = CreateToken(claims, headers, "private-key.pem", Server.MapPath("/"));
request3.AddParameter("assertion", jwtToken);
System.Diagnostics.Debug.WriteLine("jwtToken:" + jwtToken);
var response = client3.Execute<OAuthToken>(request3);
System.Diagnostics.Debug.WriteLine("response content:" + response.Content); //<-- getting "invalid_grant"
return response.Data;
使用 https://jwt.io/ 验证了 jwt 令牌,并且解码得很好。 是 docusign 演示沙盒
提前致谢 丹尼尔
【问题讨论】:
-
您使用的是用户同意还是管理员同意?如果管理员同意,那么您需要先在 DocuSign 中声明电子邮件域。如果用户同意,则需要通过授权码授予 URL 获得用户的同意。
-
嗨,阿米特,是的,我正在使用用户同意,从回调中我得到 访问令牌,并用它调用 /oauth/userinfo 得到“子”。我相信我在管理控制台中遗漏了一些东西
-
request3.AddParameter() 方法在生成访问令牌时会在请求正文中添加“grant_type”和“assertion”吗?
-
是的,先生,POST 数据在正文中传输并且是 URI 编码的。以防万一我尝试以查询字符串的形式发布也没有运气。我已经用 Fiddler 检查了这种行为
-
它不应该在 URL 中,它应该只在正文中。您可以在 jwt.io 网站中创建断言,然后使用 Postman 生成“AccessToken”,只是为了查看 DS Admin' Integrator Key 中的所有内容是否正确配置以及您是否正确获得了用户同意。
标签: oauth jwt docusignapi