Я несколько дней борюсь с попытками получить доступ к GMail Google API из скрипта node.js, используя googleapis lib.Однажды мне это удалось, но я не могу вспомнить, как я это сделал, я попытался сбросить делегирование проекта, служебной учетной записи и домена G-Suite в соответствии с документом Google.
Вот что я сделал:
В моей консоли GCP Console: 1. Существующая организация: lechorodescharentes.org 2. В этой организации я создал проект: choro-dev 3. В этом проекте я создал служебную учетную запись: choro-dev-postoffice with choro-dev-postoffice с ролью TokenGenerator и включенной делегацией домена Google Apps загрузил новый закрытый ключ (файл JSON) 4. Я включил API-интерфейс GMail (из меню Libray)
В административной консоли моего домена G-Suite, 5. Я добавил следующие копии для идентификатора клиента этой учетной записи службы "https://www.googleapis.com/auth/admin.directory.user"," https://www.googleapis.com/auth/admin.directory.group"
Клиент Node.js. Я пытаюсь получить доступ к API GMail с помощью следующего кода функции Firebase, используя библиотеку googleapis node.js с аутентификацией сервера-сервера с использованием учетной записи службы, см. Код клиента node.js. В этом коде яесть две функции аутентификации: connect (): к веб-токену JSON санкционировать (): запросить токен доступа у сервера авторизации Google OAuth 2.0
Развернута функция Firebase
Запустите функцию У меня отображается клиент JWT Функция завершилась с ошибкой: {"infos": "unauthorized_client: Клиент не авторизован для получения маркеров доступа с использованием этого метода."}
код клиента node.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const {google} = require('googleapis');
const nodemailer = require('nodemailer')
const _ = require('lodash');
const KEY = require('./service-key.json');
function connect () {
return new Promise((resolve, reject) => {
const jwtClient = new google.auth.JWT(
KEY.client_email,
null,
KEY.private_key,
_.values(KEY.scopes), // scopes as authorized in G-Suite admin
KEY.admin_email . // impersonated user
);
jwtClient.authorize((err) => {
if(err) {
reject(err);
} else {
resolve(jwtClient); // returns client
}
});
});
}
// Send a message to the contact user
function sendMessage (client, sender, msg) {
return new Promise((resolve, reject) => {
var transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: KEY.admin_email,
serviceClient: KEY.client_id,
privateKey: KEY.private_key,
accessToken: client.access_token,
refreshToken: client.refresh_token,
expires: client.expiry_date
}
});
const mailOptions = {
from: 'SITE CONTACT<' + sender + '>',
to: KEY.contact_email,
subject: 'Message',
text: 'From: ' + sender + '\n\n' + msg,
html: '<h1>Message</h1><p>From: ' + sender + '</p><p>' + msg + '</p>'
};
transporter.sendMail(mailOptions, (err, response) => {
if (err) {
reject(err);
return;
}
resolve(response);
});
});
}
function newContactMessage (from, msg) {
return connect()
.then(client => {
return sendMessage(client, from, msg);
});
}
exports.sendContactMessage = functions.https.onRequest((req, res) => {
const sender_email = 'dufourisabelle@orange.fr';
const sender_msg = 'just a test message to contact the site owner.'
newContactMessage(sender_email, sender_msg).then(() => {
return {status: 200};
}, error => {
return {status: error.status, infos: error.message};
}).then(response => {
return res.send(response);
}).catch(console.error);
});
Что я могу добавить к нему?Я постараюсь заново начать весь процесс и молюсь ... ??