来自Angular SPA的DocuSign令牌API的“ invalid_grant”错误

时间:2019-06-05 10:33:46

标签: c# docusignapi asp.net-core-webapi

我正在使用以下代码从docusign获取访问令牌并刷新令牌。 但是我总是收到无效授予错误。我要粘贴下面的代码。

    [HttpGet("GetDocToken")]
    [AllowAnonymous]
    public async Task<IActionResult> getToken(string docCode)
    {
        var x = docCode.Length;
        var client = new HttpClient();
        var authCode=Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("ced8998a-4387-4f30-9ab7-51c0d1af49bf:d7c3ccd4-22fa-4f18-a540-ddf11d8b2c9f"));
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authCode);
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

        var requestContent = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("grant_type", "authorization_code"),
            new KeyValuePair<string, string>("code", docCode),
            new KeyValuePair<string, string>("redirect_uri", "http://localhost:4200/auth")
        });

        HttpResponseMessage response = await client.PostAsync("https://account-d.docusign.com/oauth/token", requestContent);
        string resultContent = response.Content.ReadAsStringAsync().Result;
        return Ok(response.Content.ReadAsStringAsync());
    }

1 个答案:

答案 0 :(得分:1)

我的假设是您已经从DocuSign身份系统收到了验证码,并正在尝试将其交换为访问令牌。

几个问题:

docs错误地指示在请求中应包含redirect_uri。文档中的示例请求确实正确显示了该请求应仅包含grant_typecode参数。

  

注意:尽管OAuth standard的第4.1(d)节确实指示应包含redirect_url,但DocuSign通常不包括它。

我的猜测是DocuSign将忽略redirect_uri参数,但您可能希望尝试将其忽略。

另一个问题是时间安排:您从DocuSign那里收到的授权码只有一分钟左右的时间。如果您不是立即使用授权代码(您的代码为docCode),则会收到“无效授予”错误。

众所周知的优秀示例软件

我建议您也检查known-good code example for C#。您可以使用协议查看器来查看身份验证过程中的确切操作。

使用图书馆

我还建议您寻找可用于代替自己的OAuth授权代码客户端库。

例如,您是否正在设置和检查状态值?这样做必须停止CSRF攻击。参见此article

已添加

我也不清楚您使用正确的值作为authorization code

我认为流程应该是:

  1. 用户在Angular应用中按“使用DocuSign进行身份验证”。
  2. 用户的浏览器将GET发送到DocuSign身份验证服务器。此时,浏览器不再运行Angular应用。
  3. 用户的浏览器和DocuSign身份验证服务器在用户通过DocuSign进行身份验证时来回交换HTML。
  4. 用户使用DocuSign完成身份验证过程。
  5. DocuSign向浏览器发送一个REDIRECT响应,告诉浏览器对重定向URL进行GET。重定向(和GET)包括codestate的查询参数
  6. 您的服务器(不是Angular应用程序)收到GET请求。
  7. 您的服务器应:
    1. 提取codestate查询参数
    2. 验证state与步骤2中发送的相同。
    3. 向DocuSign发出POST请求,以交换访问令牌的授权代码。
    4. 使用Angular程序响应浏览器。
  8. Angular程序现在再次在浏览器上运行。

使用隐式授予

您的另一个选择是使用隐式授予。这样,您就不需要服务器组件。使用隐式授予,您的Angular程序可以处理流程。