Ошибка 500 backendError с Gmail API и клиентом узла Google API

#google-api-nodejs-client #gmail-api

#google-api-nodejs-client #gmail-api

Вопрос:

Я пытаюсь использовать новый Gmail API с клиентом узла Google API. Я создал новый проект из консоли разработчика, настроил новый идентификатор клиента «Учетной записи службы» и разрешил доступ к API.

В качестве доказательства концепции я просто пытаюсь перечислить потоки в моем почтовом ящике. Когда я включаю переключатель OAuth 2.0 для API Explorer и ввожу свой адрес электронной почты, запрос выполняется успешно, и я вижу ответ JSON с данными.

Теперь я пытаюсь сделать то же самое в Node:

 var googleapis = require('googleapis');

var SERVICE_ACCOUNT_EMAIL = '...SNIP...';

// generated by: openssl pkcs12 -in ...SNIP...p12 -out key.pem -nocerts -nodes
var SERVICE_ACCOUNT_KEY_FILE = 'key.pem';
var jwt = new googleapis.auth.JWT(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_KEY_FILE,
        null,
        ['https://www.googleapis.com/auth/gmail.readonly']);

googleapis
    .discover('gmail', 'v1')
    .execute(function(err, client) {

        jwt.authorize(function(err, result) {
            if(err) console.error(err);
            else console.log(result);

            client.gmail.users.threads.list()
                .withAuthClient(jwt)
                .execute(function(err, result) {
                    if(err) console.error(err);
                    else console.log(result);
            });
        });
    });
  

Сначала я печатаю результаты authorize() вызова, который выглядит так, как будто он возвращает токен, поэтому я думаю, что у меня все настройки OAuth настроены правильно:

 { access_token: '...SNIP...',
  token_type: 'Bearer',
  expires_in: 1404277946,
  refresh_token: 'jwt-placeholder' }
  

Затем я пытаюсь фактически использовать API, но получаю сообщение об ошибке:

 { errors: 
   [ { domain: 'global',
       reason: 'backendError',
       message: 'Backend Error' } ],
  code: 500,
  message: 'Backend Error' }
  

На данный момент я не знаю, что еще попробовать. Я думаю, что материал OAuth работает правильно, потому что я не получил никаких ошибок аутентификации. Я также думаю, что сам API работает, и с моей учетной записью все в порядке, потому что я могу использовать его через API Explorer. Я не вижу никаких признаков того, что библиотека узла также неисправна. Короче говоря, я понятия не имею, в чем проблема. Есть идеи?

Ответ №1:

Вы используете учетную запись службы для аутентификации ваших запросов в GMail. Насколько я знаю, в вашей учетной записи службы не будет Gmail, только у пользователей есть GMail. По этой причине вам нужно будет выполнить поток OAuth2 с пользователем (смотрите здесь, например).

Комментарии:

1. Хм, это довольно интересно. Я пытаюсь сделать то же самое, а именно использовать учетную запись службы OAuth 2.0 с Gmail API, а также получить ошибку сервера 500. Есть ли у вас источник, в котором говорится, что вы не можете использовать учетную запись службы с GMail API? Я думал, что, поскольку это было создано через консоль разработчика Google пользователя, оно будет связано с этим пользователем?

2. Да, здесь говорится, что аутентификация выполняется путем аутентификации пользователя с помощью потока OAuth 2.0, и описывается общий поток аутентификации с аутентификацией конечного пользователя: 1. Во время разработки зарегистрируйте приложение в консоли разработчиков Google. 2. При запуске приложения запросите, чтобы пользователь предоставил доступ к данным в своей учетной записи Google. 3. Если пользователь соглашается, ваше приложение запрашивает и получает учетные данные для доступа к Gmail API. 4. Обновите учетные данные (при необходимости).