#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. Обновите учетные данные (при необходимости).