通过服务帐户设置 Gmail 委托时出现权限不足错误
Insufficient Permission error when setting Gmail delegate through service account
我有一个具有域范围委托的服务帐户,我正尝试使用它通过 App Script 应用设置 Gmail 委托。我正在为 App 脚本使用 Google 的 OAuth2 库。
源用户(将读取他们的邮件并被冒充以执行操作)是一个普通的非管理员用户。当 运行 下面的代码时,我收到以下关于权限不足的错误:
{error={code=403.0, message=Insufficient Permission, errors=[{domain=global, reason=insufficientPermissions, message=Insufficient Permission}]}}
我可以很好地读取同一用户的代表,只有在尝试通过 API 修改他们帐户上的任何 属性 时才会出现此错误。
我已尝试在“我的帐户”>“安全”部分中删除该应用程序的权限并重新接受身份验证提示(虽然我在项目中启用它是安全的,但我没有收到接受 Gmail 提示的提示 - 它在清单)。
我不确定问题出在哪里 - 有无数 Whosebug 问题都带有相同的错误代码,但 none 似乎有所帮助 - 大多数人说要刷新凭据。
- 具有服务帐户的项目启用了 Gmail API 和 Admin SDK
- App Script 应用在管理控制台中设置为受信任。
- 已在服务帐户上启用全域委派
- DWD 服务帐户的客户端 ID 已在所有 Gmail 范围的管理控制台中列入白名单。
- 我还尝试清除存储在脚本属性中的授权 window。
- Gmail 的所有 Google API 都在 OAuth 同意屏幕页面上列入白名单
这是我的代码:
function setGmailDelegateTest() {
var boxEmail = 'robert.terwilliger@x.com';
var userEmail = 'ihyzy@x.com';
var service = getGmailSharingService_(boxEmail);
if (service.hasAccess()) {
var url = 'https://www.googleapis.com/gmail/v1/users/' + boxEmail +'/settings/delegates';
var response = UrlFetchApp.fetch(url, {
method: 'post',
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
},
body: {
"delegateEmail": userEmail,
"verificationStatus": "accepted"
},
muteHttpExceptions: true
});
var result = JSON.parse(response.getContentText());
Logger.log(result);
} else {
Logger.log(service.getLastError());
}
}
function getGmailSharingService_(boxEmail) {
return OAuth2.createService('gmail:' + boxEmail)
.setTokenUrl('https://oauth2.googleapis.com/token')
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
.setSubject(boxEmail)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://mail.google.com/ https://www.googleapis.com/auth/gmail.settings.sharing');
}
遇到这种情况是因为需要将范围作为数组传递,因为要传递两个范围。请尝试将以下内容作为您的范围。
.setScope(['https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.settings.sharing']);
最终决议
var payload = {
"delegateEmail": "jdoe@example.com",
"verificationStatus": "accepted"
}
var options = {
"method" : "POST",
"contentType": "application/json",
"muteHttpExceptions": true,
"headers" : {
"Authorization" : 'Bearer ' + service.getAccessToken()
},
"payload" : JSON.stringify(payload)
};
var url = 'https://www.googleapis.com/gmail/v1/users/' + user +
'/settings/delegates';
var response = UrlFetchApp.fetch(url, options);
var json = response.getContentText();
我有一个具有域范围委托的服务帐户,我正尝试使用它通过 App Script 应用设置 Gmail 委托。我正在为 App 脚本使用 Google 的 OAuth2 库。
源用户(将读取他们的邮件并被冒充以执行操作)是一个普通的非管理员用户。当 运行 下面的代码时,我收到以下关于权限不足的错误:
{error={code=403.0, message=Insufficient Permission, errors=[{domain=global, reason=insufficientPermissions, message=Insufficient Permission}]}}
我可以很好地读取同一用户的代表,只有在尝试通过 API 修改他们帐户上的任何 属性 时才会出现此错误。
我已尝试在“我的帐户”>“安全”部分中删除该应用程序的权限并重新接受身份验证提示(虽然我在项目中启用它是安全的,但我没有收到接受 Gmail 提示的提示 - 它在清单)。
我不确定问题出在哪里 - 有无数 Whosebug 问题都带有相同的错误代码,但 none 似乎有所帮助 - 大多数人说要刷新凭据。
- 具有服务帐户的项目启用了 Gmail API 和 Admin SDK
- App Script 应用在管理控制台中设置为受信任。
- 已在服务帐户上启用全域委派
- DWD 服务帐户的客户端 ID 已在所有 Gmail 范围的管理控制台中列入白名单。
- 我还尝试清除存储在脚本属性中的授权 window。
- Gmail 的所有 Google API 都在 OAuth 同意屏幕页面上列入白名单
这是我的代码:
function setGmailDelegateTest() {
var boxEmail = 'robert.terwilliger@x.com';
var userEmail = 'ihyzy@x.com';
var service = getGmailSharingService_(boxEmail);
if (service.hasAccess()) {
var url = 'https://www.googleapis.com/gmail/v1/users/' + boxEmail +'/settings/delegates';
var response = UrlFetchApp.fetch(url, {
method: 'post',
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
},
body: {
"delegateEmail": userEmail,
"verificationStatus": "accepted"
},
muteHttpExceptions: true
});
var result = JSON.parse(response.getContentText());
Logger.log(result);
} else {
Logger.log(service.getLastError());
}
}
function getGmailSharingService_(boxEmail) {
return OAuth2.createService('gmail:' + boxEmail)
.setTokenUrl('https://oauth2.googleapis.com/token')
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
.setSubject(boxEmail)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://mail.google.com/ https://www.googleapis.com/auth/gmail.settings.sharing');
}
遇到这种情况是因为需要将范围作为数组传递,因为要传递两个范围。请尝试将以下内容作为您的范围。
.setScope(['https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.settings.sharing']);
最终决议
var payload = {
"delegateEmail": "jdoe@example.com",
"verificationStatus": "accepted"
}
var options = {
"method" : "POST",
"contentType": "application/json",
"muteHttpExceptions": true,
"headers" : {
"Authorization" : 'Bearer ' + service.getAccessToken()
},
"payload" : JSON.stringify(payload)
};
var url = 'https://www.googleapis.com/gmail/v1/users/' + user +
'/settings/delegates';
var response = UrlFetchApp.fetch(url, options);
var json = response.getContentText();