Недостаточная ошибка прав доступа при настройке делегата Gmail через служебную учетную запись - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть служебная учетная запись с делегированием по всему домену, которую я пытаюсь использовать для настройки делегата Gmail через приложение App Script. Я использую библиотеку Google OAuth2 для скрипта приложения.

Исходный пользователь (который прочитает свою почту и подделывается под действие), является обычным пользователем без прав администратора. При выполнении кода ниже я получаю следующую ошибку о недостаточных разрешениях:

{error={code=403.0, message=Insufficient Permission, errors=[{domain=global, reason=insufficientPermissions, message=Insufficient Permission}]}}

Я могу нормально читать делегатов одного и того же пользователя, я получаю эту ошибку только при попытке изменить любое свойство в своей учетной записи через API.

Я попытался удалить разрешение приложения в разделе «Моя учетная запись> Безопасность» и повторно принять запросы авторизации (мне не выдается приглашение на приглашение Gmail, хотя я включил его в проекте, чтобы обеспечить его безопасность - это в манифесте).

Я не уверен, в чем проблема - существует бесчисленное множество вопросов StackOverflow с таким же кодом ошибки, но, похоже, ни один из них не помог - большинство говорят, чтобы обновить sh учетные данные.

  • В проекте с учетной записью службы включены Gmail API и Admin SDK
  • Для приложения «Сценарий приложения» в консоли администратора установлено значение «Надежное».
  • В службе разрешено делегирование всего домена. account
  • Идентификатор клиента для учетной записи службы DWD занесен в белый список в консоли администратора со всеми областями Gmail.
  • Я также попытался очистить полномочия, хранящиеся в окне свойств скрипта.
  • Все API Google для Gmail включены в белый список на странице экрана 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');
}

1 Ответ

2 голосов
/ 21 апреля 2020

Это происходит, потому что область должна быть передана в виде массива, поскольку передаются две области. Пожалуйста, попробуйте с указанным ниже в качестве вашей области.

.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();
...