Node.js 谷歌套件-谷歌API访问-客户端未经授权使用此方法检索访问令牌
几天来,我一直在努力使用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 谷歌套件-谷歌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开发邮局和角色令牌生成器 并启用了
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库发送消息,正如在这个问题中所描述的。。。