Gmail API unauthorized_client с nodemailer - отсутствует область действия? - PullRequest
0 голосов
/ 25 февраля 2020

Моя функция (развернутая как облачная функция Firebase) использует Nodemailer для отправки электронной почты с помощью Gmail.

  • Я создал служебную учетную запись в консоли CCP feedback@project-name.iam.gserviceaccount.com
  • Я включил Gmail API в консоли GCP для этого проекта https://console.cloud.google.com/apis/library/gmail.googleapis.com
  • Функция использует nodemailer для отправки электронной почты

Я получаю ошибку Error: unauthorized_client, несмотря на указание всего, как в https://nodemailer.com/smtp/oauth2/#oauth -2lo

unauthorized_client - этот клиент не авторизован для использования запрошенного типа предоставления. Например, если вы ограничите, какие приложения могут использовать неявное предоставление, вы вернете эту ошибку для других приложений.

Проблема может быть в моем коде или в настройке учетных данных OAuth в На консоли GCP я не смог найти способ специально включить область действия Gmail SMTP OAuth2 (https://mail.google.com/) для моей службы.

Я нашел только статьи о том, как добавить области учетных записей служб в G Suite. Нужно ли активировать его, чтобы это можно было выполнить?

Credentials in Google Cloud Platform (GCP)

function.js

const nodemailer = require('nodemailer');
const serviceAccountRelease = require('./config/serviceAccountRelease');
const mailConfig = require('./config/mailConfig');

exports.sendMail = (subject, message, callback) => {

    const authOptions = {
        auth: {
            type: 'OAuth2',
            user: mailConfig.from, // serviceAccountRelease.client_email
            serviceClient: serviceAccountRelease.client_id,
            privateKey: serviceAccountRelease.private_key,
        },
    };

    const transporterOptions = {
        service: "gmail",
        // host: 'smtp.gmail.com',
        // port: 465,
        // secure: true,
        ...authOptions
    };

    const transporter = nodemailer.createTransport(transporterOptions);
    transporter.on('token', token => console.log(token));

    const mailOptions = {
        from: mailConfig.from, // serviceAccountRelease.client_email,
        to: mailConfig.to,
        subject: subject,
        text: message
    };

    return transporter.sendMail(mailOptions, (error, response) => {
        error ? console.error("Error:", error) : console.log("Info:", info);
        transporter.close();
        return callback ?  callback(error, response) : {error, response};
    });
};

Журнал консоли:

> var {sendMail} = require('./sendMail');
undefined
> sendMail("Subject","Message")
undefined
> Error: Error: unauthorized_client
    at /Users/User/Developer/Project/functions/node_modules/nodemailer/lib/xoauth2/index.js:259:33
    at PassThrough.<anonymous> (/Users/User/Developer/Project/functions/node_modules/nodemailer/lib/xoauth2/index.js:328:20)
    at Object.onceWrapper (events.js:299:28)
    at PassThrough.emit (events.js:210:5)
    at PassThrough.EventEmitter.emit (domain.js:540:23)
    at endReadableNT (_stream_readable.js:1200:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'EAUTH',
  command: 'AUTH XOAUTH2'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...