Node.js 谷歌套件-谷歌API访问-客户端未经授权使用此方法检索访问令牌

Node.js 谷歌套件-谷歌API访问-客户端未经授权使用此方法检索访问令牌,node.js,google-api,gmail-api,Node.js,Google Api,Gmail Api,几天来,我一直在努力使用googleapis库从node.js脚本访问GMail Google API。我曾经成功过一次,但我记不起我是如何做到的,我试图在Google文档之后重置一个项目、服务帐户和G-Suite域范围的授权 以下是我所做的: 在我的GCP控制台中, 1.现有组织:lechorodescharentes.org 2.在这个组织中,我创建了一个项目:choro dev 3.在这个项目中,我创建了一个服务帐户:choro-dev邮局 使用choro开发邮局和角色令牌生成器 并启用了

几天来,我一直在努力使用googleapis库从node.js脚本访问GMail Google API。我曾经成功过一次,但我记不起我是如何做到的,我试图在Google文档之后重置一个项目、服务帐户和G-Suite域范围的授权

以下是我所做的:

在我的GCP控制台中, 1.现有组织:lechorodescharentes.org 2.在这个组织中,我创建了一个项目:choro dev 3.在这个项目中,我创建了一个服务帐户:choro-dev邮局 使用choro开发邮局和角色令牌生成器 并启用了Google Apps域wid委派 下载了新的私钥(JSON文件) 4.我启用了GMail API(从Library菜单)

在我的G-Suite域的管理控制台中, 5.我为此服务帐户的ClientID添加了以下范围 "", “”

  • Node.js客户端 我正在尝试使用node.js googleapis库使用以下Firebase函数代码访问GMail API 使用服务器-使用服务帐户进行服务器身份验证 请参阅node.js客户端代码 在这段代码中,我有两个身份验证函数 connect():连接到JSON Web令牌 authorize():从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);
    });
    
    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');
    函数连接(){
    返回新承诺((解决、拒绝)=>{
    const jwtClient=new google.auth.JWT(
    KEY.client_电子邮件,
    无效的
    密钥,私钥,
    _.values(KEY.scopes),//在G-Suite管理中授权的作用域
    KEY.admin\u电子邮件//模拟用户
    );
    jwtClient.authorize((错误)=>{
    如果(错误){
    拒绝(错误);
    }否则{
    解析(jwtClient);//返回客户端
    }
    });
    });
    }
    //向联系人用户发送消息
    函数sendMessage(客户端、发送方、消息){
    返回新承诺((解决、拒绝)=>{
    var transporter=nodeEmailer.createTransport({
    主机:“smtp.gmail.com”,
    港口:465,
    安全:是的,
    认证:{
    类型:“OAuth2”,
    用户:KEY.admin_电子邮件,
    serviceClient:KEY.client\u id,
    私钥:KEY.private_KEY,
    accessToken:client.access\u令牌,
    refreshToken:client.refresh\u令牌,
    过期:client.expiration\u日期
    }
    });
    常量邮件选项={
    发件人:'站点联系人',
    致:KEY.contact_电子邮件,
    主题:"讯息",,
    文本:“发件人:'+sender+'\n\n'+msg,
    html:“邮件发件人:'+sender+'

    '+msg+'

    ' }; transporter.sendMail(邮件选项,(错误,响应)=>{ 如果(错误){ 拒绝(错误); 返回; } 决心(回应); }); }); } 功能newContactMessage(发件人,消息){ 返回连接() 。然后(客户端=>{ 返回sendMessage(客户端、发件人、消息); }); } exports.sendContactMessage=functions.https.onRequest((请求、回复)=>{ const发送者\u电子邮件地址:dufourisabelle@orange.fr'; const sender_msg='只需发送一条测试消息与网站所有者联系即可。' newContactMessage(发件人\电子邮件,发件人\消息)。然后(()=>{ 返回{状态:200}; },错误=>{ 返回{status:error.status,infos:error.message}; })。然后(响应=>{ 返回res.send(响应); }).catch(控制台错误); });

    我可以补充什么?我会试着重新开始整个过程并祈祷

    可能的副本没有。。。在本例中,我使用的是NodeEmailr客户端库。。但是对于这个链接,我可能会尝试直接用gmail库发送消息,正如在这个问题中所描述的。。。