API GSuite Alert Center возвращает "идентификатор клиента не может быть выведен из запроса или идентификатора вызывающего абонента". ошибка
Я пытаюсь получить список предупреждений из API центра предупреждений GSuite в приложении Node JS. Я создал учетную запись службы на странице IAM и администратора, проверил
Enable G Suite Domain-wide Delegation
флажок и сгенерировал файл JSON с установленными ключами доступа. Затем я пошел в
Admin Console -> Security -> API controls -> Domain-wide Delegation
и зарегистрировал Учетную запись службы по ее идентификатору клиента с
https://www.googleapis.com/auth/apps.alerts
объем.
Код был взят из примера, представленного в google-api-nodejs-client, и в основном выглядит так:
const { google } = require('googleapis');
const alertcenter = google.alertcenter('v1beta1');
const auth = new google.auth.GoogleAuth({
keyFile: 'Path/to/my/file/with/accessKeys'
scopes: ['https://www.googleapis.com/auth/apps.alerts'],
});
const client = await auth.getClient();
google.options({auth: client});
const res = await alertcenter.alerts.list();
Что я получаю от API, так это "идентификатор клиента не может быть выведен из запроса или идентификатора вызывающего абонента". сообщение об ошибке.
Я попытался передать идентификатор клиента в качестве параметра методу list(), поскольку он описан как его допустимый параметр. Как это
const res = await alertcenter.alerts.list({ customerId: 'my-customer-id' });
В результате я получил только еще одно сообщение об ошибке: Запрос содержит недопустимый аргумент.
Что я делаю не так?
1 ответ
Эй, у меня была такая же проблема, и это сводило меня с ума.
Я обнаружил, что для авторизации требуется адрес электронной почты пользователя, связанный с «клиентом», который требуется в учетных данных. Это электронное письмо должно быть от учетной записи пользователя, имеющего доступ к центру оповещений.
Это требуется в параметре «субъект» учетных данных авторизации.
Я не мог сделать это с помощью объекта GoogleAuth, поскольку он не работает, но с помощью JWT, который аналогичен
Я следил за своим носом по проблеме с питоном, которая была у людей здесь https://github.com/googleapis/google-api-python-client/issues/777 .
const {google} = require('googleapis');
const scopes = ['https://www.googleapis.com/auth/apps.alerts'];
const credentials = require("Path/to/my/file/with/accessKeys");
// email with access to alert center
const auth_email = 'someemail@domain.com';
async function runSample() {
const authClient = new google.auth.JWT({
email:credentials.client_email,
key: credentials.private_key,
scopes: scopes,
subject: auth_email
});
authClient.authorize(function(err, tokens) {
if (err) {
console.log(err);
return;
} else {
authClient.setCredentials(tokens);
}
});
google.options({
auth: authClient
});
const alertcenter = google.alertcenter('v1beta1');
const res = await alertcenter.alerts.list();
console.log(res.data);
return res.data;
}
if (module === require.main) {
runSample().catch(console.error);
}
// Exports for unit testing purposes
module.exports = {runSample};
Это работает для меня сейчас - может быть другой способ назначить тему / адрес электронной почты для авторизации с помощью
GoogleAuth
но я не могу понять это.