Google Suite - доступ к API Google - клиент не авторизован для получения токенов доступа с помощью этого метода - PullRequest
0 голосов
/ 21 мая 2018

Я несколько дней борюсь с попытками получить доступ к 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);
});

Что я могу добавить к нему?Я постараюсь заново начать весь процесс и молюсь ... ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...