You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DocuSign API令牌授权无效:无法获取信封数据

解决DocuSign API调用401(AUTHORIZATION_INVALID_TOKEN)问题

核心原因分析

你使用的客户端凭证(client_credentials)授权模式存在权限限制:该模式生成的Token仅能访问应用自身创建的信封,无法获取账户下所有用户的信封数据。这是DocuSign OAuth的设计规则,客户端凭证属于应用级权限,而非用户级权限。

排查与修复步骤

1. 验证Token有效性

  • 复制生成的access_token,用jwt.io解码,检查以下字段:
    • aud:需匹配你的环境(demo环境应为account-d.docusign.com)
    • iss:应为你的应用Client ID
    • account_id:需和API调用中使用的xxxxxxxx账户ID完全一致
    • exp:确认Token未过期(客户端凭证Token有效期默认1小时)

2. 检查应用账户权限(客户端凭证模式适配)

如果坚持使用客户端凭证模式,需确保:

  • 在DocuSign Admin后台,将你的应用添加到目标账户中
  • 给应用分配足够的权限(如“信封读取”权限)

3. 切换到授权码模式(推荐)

要获取账户下所有信封数据,建议使用授权码(authorization code)授权模式,该模式能获取用户级权限,访问账户内所有信封。修改方向:

  • 在DocuSign开发者平台配置应用的重定向URI(Google Apps Script可使用部署后的Web App地址)
  • 实现授权流程:引导用户登录授权,获取授权码,再兑换成access_token
  • 注意:授权码模式生成的Token带有refresh_token,可用于自动刷新,避免频繁重新授权

代码调整建议(授权码模式核心逻辑)

// 第一步:引导用户授权(需部署为Web App)
function doGet() {
  var clientId = "YOUR_CLIENT_ID";
  var redirectUri = "YOUR_WEB_APP_URL";
  var authUrl = "https://account-d.docusign.com/oauth/auth?" +
    "response_type=code&" +
    "client_id=" + clientId + "&" +
    "redirect_uri=" + encodeURIComponent(redirectUri) + "&" +
    "scope=signature%20impersonation";
  return HtmlService.createHtmlOutput('<a href="' + authUrl + '">授权访问DocuSign</a>');
}

// 第二步:接收授权码并兑换Token
function doPost(e) {
  var code = e.parameter.code;
  var clientId = "YOUR_CLIENT_ID";
  var clientSecret = "YOUR_CLIENT_SECRET";
  var redirectUri = "YOUR_WEB_APP_URL";
  
  var tokenUrl = "https://account-d.docusign.com/oauth/token";
  var payload = {
    grant_type: "authorization_code",
    client_id: clientId,
    client_secret: clientSecret,
    code: code,
    redirect_uri: redirectUri
  };
  
  var response = UrlFetchApp.fetch(tokenUrl, {
    method: "POST",
    contentType: "application/x-www-form-urlencoded",
    payload: payload
  });
  
  var tokenData = JSON.parse(response.getContentText());
  // 保存refresh_token和access_token到脚本属性或Sheet中
  PropertiesService.getScriptProperties().setProperty("refresh_token", tokenData.refresh_token);
  PropertiesService.getScriptProperties().setProperty("access_token", tokenData.access_token);
  
  return HtmlService.createHtmlOutput("授权成功!");
}

// 使用Token调用API
function getAllEnvelopes() {
  var accessToken = PropertiesService.getScriptProperties().getProperty("access_token");
  var apiUrl = "https://demo.docusign.net/restapi/v2.1/accounts/YOUR_ACCOUNT_ID/envelopes";
  
  var headers = {
    "Authorization": "Bearer " + accessToken
  };
  
  var response = UrlFetchApp.fetch(apiUrl, { headers: headers });
  var envelopes = JSON.parse(response.getContentText()).envelopes;
  // 处理信封数据...
}

额外注意事项

  • 确保API调用环境一致:生成Token用account-d.docusign.com(demo),API调用必须用demo.docusign.net,不能混用生产环境地址
  • 检查getAccessToken函数返回的Token是否有多余空格(比如拼接Bearer 时的空格是否正确)
  • 查看Logger中的headers输出,确认Authorization头格式为Bearer xxxxxxxxxx(无多余字符)

内容的提问来源于stack exchange,提问作者user13125666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:07:48