错误:从属性存储中删除持有者令牌后,访问权限未授予或已过期



我正在使用 oauth2 库来获取服务帐户的身份验证和域范围的委派以更改用户的签名:

function setSignature(email, signatureHtml) {  
var service = getDomWideDelegationService('Gmail: ', 
'https://www.googleapis.com/auth/gmail.settings.basic', email);
var resource = { signature: signatureHtml };
var requestBody                = {};
requestBody.headers            = {'Authorization': 'Bearer ' + service.getAccessToken()};
requestBody.method             = "PUT";
requestBody.contentType        = "application/json";
requestBody.payload            = JSON.stringify(resource);
requestBody.muteHttpExceptions = false;
var emailForUrl = encodeURIComponent(email);
var url = 'https://www.googleapis.com/gmail/v1/users/me/settings/sendAs/' + emailForUrl;
var setSignatureResponse = UrlFetchApp.fetch(url, requestBody);
}

function getDomWideDelegationService(serviceName, scope, email) {
Logger.log('starting getDomainWideDelegationService for email: ' + email);
var props = PropertiesService.getScriptProperties();
const key = props.getProperty("OAUTH2_SERVICE_ACCOUNT_PRIVATE_KEY");
const serviceaccount = props.getProperty("OAUTH2_SERVICE_ACCOUNT_CLIENT_EMAIL");
return OAuth2.createService(serviceName + email)
// Set the endpoint URL.
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(key)
.setIssuer(serviceaccount)
.setSubject(email)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope(scope);
}

这工作正常,直到我将keyserviceaccount电子邮件从硬编码字符串替换为PropertiesStore中的值,如上所示。当我这样做时,我不小心删除了每个用户的 PropertiesStore 中的 oauth2 条目。现在我收到以下错误

错误:访问权限未授予或已过期。 at Service_.getAccessToken(Service:454:11(

一段时间后,我不知何故设法让它工作,但只有一个用户(即管理员用户(。对于所有其他用户,我仍然收到此错误。

为什么?我认为每次都会请求令牌,如果我从属性存储中删除它应该没关系。

[编辑] 现在,在我使用用户属性并将其更改回以前的方式后,管理员帐户也不再起作用......

[编辑2]我现在可以指出问题所在。显然,从PropertyStore读取key是问题所在。当我替换此行时

const key = props.getProperty("OAUTH2_SERVICE_ACCOUNT_PRIVATE_KEY");使用密钥的硬编码值,它可以工作。

我将 ScriptProperty 中的值与正确的值进行了比较,它们是相同的。那到底是什么?

经过长时间的试验和错误,我发现了问题所在。脚本属性中的键与实际键不是 100% 相同的。

我在应用程序脚本项目 -> 文件 -> 项目属性中添加了密钥并创建了一个新行,然后用鼠标右键单击并按Paste.

当我现在将硬编码的密钥与 ScriptProperty 中的密钥进行比较时,如下所示:

var hcKey  = 'srbvwrvwrvwrvrwvrewv';
var propKey = PropertiesService.getScriptProperty().getProperty('mykey');
var val = propKey.localeCompare(hcKey); // val is 1.0

看起来它们不一样。

当我通过应用程序脚本存储密钥时,如下所示:

props.setProperty("mykey", 'srbvwrvwrvwrvwrwvrewv'(;

它有效。请注意,'srbvwrvwrvwrvrwvrewv'的值不是我在这里简化的实际键。

那么这是否意味着,通过浏览器中的上下文菜单粘贴它,会添加一些隐藏字符,例如空字符?

谁能解释一下?

最新更新