Делегирование Gmail API на уровне домена

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

function runAPI(auth) {
  var gmail = google.gmail('v1');
  gmail.users.threads.list({auth: auth, userId: '108800016305523828361'},'',function(err, response){
    if (err) {
      console.log("The API returned an error: " + err);
      return;
    }
    var threads = response.threads;
    console.log(threads);
  })
}

Я получаю ошибку:

API возвратил ошибку: Ошибка: делегирование отказано для [email protected]

В консоли администратора я сделал так:

введите здесь описание изображения

В качестве имени клиента я использовал id из файла client_secret.json. А что касается объема, я дал ему все разрешения.

Как правильно настроить делегирование домена для Gmail API?


person Kunok    schedule 28.08.2016    source источник


Ответы (2)


Настройка в порядке, однако в вашем коде вы делаете это неправильно.

Этот код:

gmail.users.threads.list ({auth: auth, userId: '108800016305523828361'}, '', функция (ошибка, ответ)

конкретно.

userId должен быть "me" однако, прежде чем вы сможете вызвать Gmail API, вам необходимо использовать служебную учетную запись "JWT flow" в своем коде, чтобы получить учетные данные oauth2 для пользователя Gmail, к которому вы хотите получить доступ, как описано в документе Подготовка к авторизованному вызову API сервисного аккаунта для домена делегирования.

В частности, при этом используется закрытый ключ вашей служебной учетной записи для запроса на получение учетных данных для желаемого пользователя (укажите адрес электронной почты пользователя в вашем домене, к которому вы хотите получить доступ, в функции setServiceAccountUser([email protected]) в запросе). Затем вы можете использовать это GoogleCredential при вызове Gmail API.

person Eric D    schedule 02.09.2016
comment
Есть ли по этому поводу документация? - person Kunok; 02.09.2016
comment
Только ссылка Preparing to make an authorized API call, которую я предоставил выше. - person Eric D; 02.09.2016
comment
Метод setServiceAccountUser([email protected]) не поддерживается для Node.js? - person Kunok; 08.09.2016
comment
Обновленный ответ, чтобы прояснить, как получить учетные данные для любого пользователя Gmail в вашем домене. Затем вы можете передать это вызову API gmail (с userId = me, чтобы использовать пользователя из учетных данных) и действовать как ЭТОГО пользователя. Надеюсь, это имеет смысл. - person Eric D; 08.09.2016
comment
Я не могу найти метод node.js setServiceAccountUser. Есть только примеры на Java и Python. И я где-то читал, что node.js находится в стадии бета-тестирования и поэтому еще не поддерживает этот класс. - person Kunok; 08.09.2016
comment
Иногда метод называется несколько иначе. Попробуйте поискать в источнике или найти его (например, пользователь, заданный пользователем для делегирования домена node.js google api). Если это не сработает, попробуйте спросить об этом в теге node.js (google-api-nodejs-client), или, возможно, один из них ответит здесь ... - person Eric D; 08.09.2016
comment
Буду искать в источнике. Я пометил вопрос как node.js, надеюсь, кто-нибудь заметит - person Kunok; 08.09.2016
comment
Кажется, что JWT для node.js не является правильным способом сделать это, как сказано в комментариях (также разработчиком Google) github.com/google/google-api-nodejs-client/issues/347 Ah, right. You cannot authorize Gmail API requests with JWT, you must use OAuth 2.0 because it needs to be auth'd to a specific user. Or else you'd be able to do some really shady things like send messages impersonating someone else. - person Kunok; 09.09.2016
comment
Я думаю, что этот человек сбит с толку. Как указано в документации, вы используете JWT в качестве учетной записи службы для запроса токена oauth2, который может использоваться API Gmail стандартным способом для запрашиваемого пользователя (я полагаю, до часа). - person Eric D; 09.09.2016

На вопрос, как правильно настроить делегирование домена для Gmail API?

Я думаю, что эта документация от Google может помочь вам в этом, просто выполните следующие действия. делегировать полномочия на уровне домена.

  1. Перейдите в консоль администратора своего домена Google Apps.

  2. В списке элементов управления выберите Безопасность. Если вы не видите Безопасность в списке, выберите Дополнительные элементы управления на серой панели внизу страницы, а затем выберите Безопасность из списка. элементов управления. Если вы не видите элементы управления, убедитесь, что вы вошли в систему как администратор домена.

  3. Выберите Показать еще, а затем Расширенные настройки из списка параметров.

  4. Выберите Управление доступом клиента API в разделе Аутентификация.

  5. В поле Имя клиента введите идентификатор клиента учетной записи службы. Вы можете найти идентификатор клиента своей сервисной учетной записи на странице Сервисные учетные записи.

  6. В поле Одна или несколько областей действия API введите список областей, к которым вашему приложению должен быть предоставлен доступ. Например, если вашему приложению требуется доступ на уровне домена к Google Drive API и Google Calendar API, введите: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.

    В вашем случае используйте эту область для Gmail API.

  7. Нажмите Авторизовать.

Для получения дополнительной информации о error 403 or Delegation denied for <user email>, проверьте этот связанный вопрос SO:

person KENdi    schedule 29.08.2016
comment
В общем, вы предполагаете, что я использую неправильный идентификатор клиента? - person Kunok; 29.08.2016
comment
просто дважды проверьте этот процесс, если вы все делаете правильно. Я также предлагаю вам проверить связанный вопрос SO, потому что он также может дать вам представление об этой проблеме :) - person KENdi; 29.08.2016
comment
После создания учетной записи службы для проекта и использования идентификатора клиента из нее в консоли администратора я все еще получаю ту же ошибку. Delegation denied for k****uno@ul*****vel.com. Я проверил QA, с которым вы связались, но эти ответы не подходили для моего случая. Поскольку ошибка говорит, что отклоняет мою электронную почту, а не мое приложение, можно ли настроить, чтобы моя электронная почта была авторизована для доступа ко всем данным внутри приложений Google нашей компании? - person Kunok; 30.08.2016