【问题标题】:DocuSign Authorization Code Grant flow returns invalid_grant errorDocuSign 授权码授予流程返回 invalid_grant 错误
【发布时间】:2016-10-05 18:33:44
【问题描述】:

DocuSign documentation 通过易于遵循的授权流程进行代码授予。我能够从初始 GET 请求中获取“代码”到 /oath/auth,但是当我在邮递员中尝试时,获取令牌会给我一个“invalid_grant”错误。我已经按照这些步骤操作,并且使用 account-d.docusign.com 作为主机的请求如下所示:

POST /oauth/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic MjMwNTQ2YTctOWM1NS00MGFkLThmYmYtYWYyMDVkNTQ5NGFkOjMwODc1NTVlLTBhMWMtNGFhOC1iMzI2LTY4MmM3YmYyNzZlOQ==

grant_type=authorization_code&code=ey2dj3nd.AAAA39djasd3.dkn4449d21d

我团队的其他两名成员也尝试过使用他们的开发者帐户,但都遇到了 invalid_grant 错误。这是否不再受支持,或者是否存在与我们可能能够调查的此错误相关的常见错误?

【问题讨论】:

    标签: docusignapi


    【解决方案1】:

    重新检查您的所有价值观。

    我也收到了同样的 invalid_grant 响应,一开始我不知道为什么。事实证明,我在 Content-Type 标头中有错字。我使用的是 application/x-www-form-urlencode 而不是 application/x-www-form-urlencoded

    您可能不是,但如果您提交的正是您在问题中发布的授权标头(MjMwNTQ2YTctOWM1NS00MGFkLThmYmYtYWYyMDVkNTQ5NGFkOjMwODc1NTVlLTBhMWMtNGFhOC1iMzI2LTY4MmM3YmYyNzZlOQ==),它将失败并显示该消息。

    这是their documentation 中提供的示例集成密钥和示例密钥的 base64 值。如果您使用online base64decoder 解码该字符串,它将导致 230546a7-9c55-40ad-8fbf-af205d5494ad:3087555e-0a1c-4aa8-b326-682c7bf276e9。这与 the documentation 中的 sample 集成密钥和秘密相同。

    通过编码您的集成密钥和秘密(integrationKey:secret)检查您提交的授权标头使用这个online base64encoder。这将确保问题不在于您的集成密钥和机密的 base64 编码。获得该值后,请确保您的授权在您从本网站获得的值之前使用 Basic 一词。 (基本 base64stringFromOnlineEncoder)

    检查您在帖子正文中提交的代码不是来自their documentation 的示例代码。 ey2dj3nd.AAAA39djasd3.dkn4449d21d 是来自their documentation 的示例代码。您可能只是在问题中使用它作为占位符,但如果您提交任何这些值,它将返回 invalid_grant。确保您的帖子正文没有任何前导或尾随空格。

    1. 设置正确的 Content-Type application/x-www-form-urlencoded
    2. 设置正确的授权标头基本 base64EncodedIntegrationKey:Secret
    3. 使用从对 /oauth/auth 的 GET 请求收到的有效代码具有正确的正文,没有前导或尾随空格,确保您没有使用问题中的值。

    如果您仍然遇到问题并且您不是在做 user application,而是在做 service integration,您可以使用旧版身份验证来获取您的 oAuth2 令牌。

    替代方法使用 Legacy Authentication 用于服务集成

    此方法不使用授权代码。您将集成密钥、用户名和密码以 JSON 格式传入 X-DocuSign-Authentication 标头。

    演示服务器:demo.docusign.net

    生产服务器:www.docusign.net API

    版本:v2

    POST https://{server}/restapi/{apiVersion}/oauth2/token
    Content-Type: application/x-www-form-urlencoded
    X-DocuSign-Authentication: {"IntegratorKey":"your_integrator_key","Password":"docusign_account_password","Username":"docusign_account_username"}
    
    grant_type=password&client_id=your_integrator_key&username=docusign_account_username&password=docusign_account_password&scope=api
    

    如果您正在构建一个用户应用程序,该应用程序需要用户输入他们的文档签名凭据来生成令牌,那么这种替代方法将不适合您。

    【讨论】:

    • 我和我的另外 2 个队友已经仔细检查了我们的价值观。我们没有使用文档中的示例 - 我们使用的是我们自己生成的集成密钥和来自我们开发者帐户的密钥。旧版身份验证不是我们的选择。
    • 在这种情况下,您没有发布足够多的代码来为您提供帮助。是的,它受支持,并且我已按照您的要求为您提供了要检查的常见错误。
    • integrationKey:secret - 如果文档这么说就好了!
    • 如果在我的流程中,我不想使用 auth GET 流程让用户授予访问权限?在这种情况下,我唯一的选择是旧的身份验证 API?例如在客户登录的客户门户中,我们希望客户就地签署合同,没有DocuSign用户登录!
    【解决方案2】:

    对于遇到此错误的任何人,我想在文档中指出这一点:

    注意:获取到的授权码只能使用2分钟。如果在获取授权码和尝试将其交换为访问令牌之间超过两分钟,则操作将失败。

    我一直在为同样的错误而苦苦挣扎,直到我发现了那条笔记并加快了打字速度以赶上 2 分钟。

    希望对其他人有所帮助。

    【讨论】:

    • 嗨@ocbit 你是对的。但是,如果授权码每 2 分钟过期一次,我是否需要通过使用重定向 url 构造 url 手动每两分钟生成一次授权码。您对如何以编程方式生成授权码有任何想法吗?
    • 不@rameshm,我只做过一次,从未在代码中尝试过。
    【解决方案3】:

    在我的情况下,问题与为 Content-Type 标头设置了错误的值有关,即“application/x-www-form-URIencoded”而不是正确的“application/x-www-form-urlencoded”。请注意,在我的情况下,问题不是“拼写错误”,而是对 DocuSign 文档的过度信任。

    在撰写本文时,确实将错误的 Content-Type 直接建议到他们描述 Authorization Code Grant 工作流程的文档页面中,相关部分请参见下图。

    希望他们能尽快修复文档,但暂时不要像我最初那样盲目地从他们的示例中复制和粘贴代码。

    【讨论】:

      【解决方案4】:

      任何人都知道这里出了什么问题,我收到了一个 BadRequest,内容如下

      {"error":"invalid_grant","error_description":"unauthorized_client"}
      
      var client = new RestClient(ESIGNURL);
                  var request = new RestRequest("/oauth/token");
                  request.Method = Method.POST;
                  request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
                  request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(integrationkey+ ":" + secret)));
      
                  string body = "grant_type=authorization_code&code=" + code;
                  request.Parameters.Clear();
                  request.AddParameter("application/x-www-form-urlencoded", body, ParameterType.RequestBody);
      
                  var response = client.Execute(request);
      

      【讨论】:

        【解决方案5】:

        我也遇到了这个错误。我意识到在将状态传递给 oauth 令牌端点之前,我在代码末尾附加了状态。

        这个 sn-p 来自 Docusign,解释了导致该错误的其他一些原因。

        Invalid-error explanation

        【讨论】:

          猜你喜欢
          • 2019-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-25
          • 2018-03-03
          相关资源
          最近更新 更多