如何通过Google Apps Script自动获取DocuSign的Access Token
解决Google Apps Script自动获取DocuSign Access Token的问题
一、修复「Error: Callback function name is required.」错误
这个错误的核心原因是你误用了http://localhost/作为回调URI,且未配置GAS OAuth2服务要求的回调函数。按以下步骤修正:
替换回调URI
- 在GAS编辑器中点击「发布」>「部署为Web应用」,生成并复制专属的Web应用URL(首次部署需设置执行权限为「任何人,甚至匿名」,后续可按需调整)。
- 登录DocuSign开发者后台,将应用的回调URI更新为上述Web应用URL。
补充OAuth服务的回调配置
修改getOAuthService函数,添加回调函数声明,并配置token持久化存储:
二、实现无需重复手动授权的自动Token管理
Authorization Code Grant模式下,首次授权后会返回有效期30天的refresh token,利用它可自动刷新8小时有效期的access token,无需每次生成授权码。完整修正代码如下:
function getAuthorizationCodeGrant() { var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; // 替换为你的GAS Web应用URL var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec'; var scope = 'signature'; var authUrl = 'https://account-d.docusign.com/oauth/auth'; var tokenUrl = 'https://account-d.docusign.com/oauth/token'; var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl); if (!service.hasAccess()) { var authorizationUrl = service.getAuthorizationUrl(); Logger.log('首次授权请打开以下URL:'); Logger.log(authorizationUrl); return HtmlService.createHtmlOutput('<a href="' + authorizationUrl + '" target="_blank">点击授权</a>'); } // 自动获取有效access token(会自动用refresh token刷新过期的token) var accessToken = service.getAccessToken(); Logger.log('Access token: ' + accessToken); // DocuSign API调用示例 var apiUrl = 'https://demo.docusign.net/restapi/v2.1/accounts'; var options = { headers: { 'Authorization': 'Bearer ' + accessToken } }; var response = UrlFetchApp.fetch(apiUrl, options); Logger.log('API response: ' + response.getContentText()); } function getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl) { return OAuth2.createService('docusign') .setAuthorizationBaseUrl(authUrl) .setTokenUrl(tokenUrl) .setClientId(clientId) .setClientSecret(clientSecret) .setRedirectUri(redirectUri) .setScope(scope) .setCallbackFunction('authCallback') // 指定回调函数 .setPropertyStore(PropertiesService.getUserProperties()); // 持久化存储token信息 } // 授权回调处理函数 function authCallback(request) { var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec'; var scope = 'signature'; var authUrl = 'https://account-d.docusign.com/oauth/auth'; var tokenUrl = 'https://account-d.docusign.com/oauth/token'; var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl); var isAuthorized = service.handleCallback(request); return isAuthorized ? HtmlService.createHtmlOutput('授权成功!可关闭此页面返回脚本编辑器查看日志。') : HtmlService.createHtmlOutput('授权失败,请重试。'); } // 手动刷新token的辅助函数(可选) function refreshToken() { var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec'; var scope = 'signature'; var authUrl = 'https://account-d.docusign.com/oauth/auth'; var tokenUrl = 'https://account-d.docusign.com/oauth/token'; var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl); if (service.hasAccess()) { service.refreshAccessToken(); Logger.log('Token已刷新'); } }
三、关键注意事项
- 首次授权:必须手动打开日志中的URL完成授权,之后脚本会自动通过refresh token刷新access token,无需重复手动操作。
- refresh token有效期:DocuSign的refresh token有效期为30天,到期后需重新授权一次。
- Web应用部署:部署时需选择「新建项目版本」,执行权限可按需设置为「自己」或「任何人」,访问权限首次授权需设为「任何人,甚至匿名」。
- OAuth2库确认:确保已安装GAS OAuth2库(库ID:
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF)。
内容的提问来源于stack exchange,提问作者user13125666
相关产品推荐
相关产品推荐

