Can';t使用Node.js验证google服务帐户
我的目标是允许人们通过我的网站(目前使用Firebase)将事件添加到日历中。我正在尝试允许他们将事件添加到服务帐户中;但是,我在获取服务帐户身份验证时遇到问题。当我尝试部署代码时,我在wait google.auth.getClient部分得到一个“意外的标记google”错误。我在全球安装了谷歌API工具Can';t使用Node.js验证google服务帐户,node.js,google-calendar-api,service-accounts,Node.js,Google Calendar Api,Service Accounts,我的目标是允许人们通过我的网站(目前使用Firebase)将事件添加到日历中。我正在尝试允许他们将事件添加到服务帐户中;但是,我在获取服务帐户身份验证时遇到问题。当我尝试部署代码时,我在wait google.auth.getClient部分得到一个“意外的标记google”错误。我在全球安装了谷歌API工具 //ADD CALENDAR EVENT const {google} = require('googleapis'); const calendar = google.calendar(
//ADD CALENDAR EVENT
const {google} = require('googleapis');
const calendar = google.calendar('v3');
//Authenticate Service Acounnt
function getCredentials() {
const filePath = path.join(__dirname, 'credentials.json';
if (fs.existsSync(filePath)) {
return require(filePath)
}
if (process.env.CREDENTIALS) {
return JSON.parse(process.env.CREDENTIALS)
}
throw new Error('Unable to load credentials')
}
//Create Calendar Event
function addEvent(event) {
return new Promise(function(resolve, reject) {
calendar.events.insert({
calendarId: 'primary',
resource: {
'summary': event.eventName,
'description': event.description,
'start': {
'dateTime': event.startTime,
'timeZone': TIME_ZONE,
},
'end': {
'dateTime': event.endTime,
'timeZone': TIME_ZONE,
},
},
}, (err, res) => {
if (err) {
console.log('Rejecting because of error');
reject(err);
}
console.log('Request successful');
resolve(res.data);
});
});
}
//Add Event To Service Acount
exports.addEventToCalendar = functions.https.onRequest((request, response) => {
const eventData = {
eventName: request.body.eventName,
description: request.body.description,
startTime: request.body.startTime,
endTime: request.body.endTime
};
const credentials = getCredentials();
const client = await google.auth.getClient({
credentials,
scopes: 'https://www.googleapis.com/auth/calendar',
})
addEvent(eventData, client).then(data => {
response.status(200).send(data);
return;
}).catch(err => {
console.error('Error adding event: ' + err.message);
response.status(500).send(ERROR_RESPONSE);
return;
});
});
我一直在关注这两个教程的组合:
我花了很多时间在谷歌上搜索可能出错的地方,但老实说,谷歌认证的东西把我弄糊涂了。如果能得到任何帮助,我将不胜感激,谢谢:)- 您希望使用服务帐户在Google日历中创建新事件
是服务帐户的凭据文件credentials.json
- 您希望通过Node.js使用googleapis实现这一点
- 您已经能够使用日历API
- 使用服务帐户时,可以使用
而不是google.auth.JWT
google.auth.getClient
- 在脚本中,
被赋予client
。但是在addEvent(eventData,client)
中,不使用函数addEvent(event){}
客户端
- 关于
,路径。需要添加join(uu dirname,'credentials.json';
。我认为)
constpath=require(“path”)还需要添加代码>
- 此修改的脚本假定
的对象可用于request.body
calendar.events.insert()的
resource
时区是否在别处声明?请小心这个
- 如果服务帐户的电子邮件未与Google电子表格共享,则无法创建事件。所以请小心这个
如果我误解了你的情况,而这不是你想要的方向,我道歉。哇!这真的很有帮助!我不知道我可以使用JWT客户端。非常感谢;“我真的很感激你的回答。”卡特西谢谢你的回答。我很高兴你的问题解决了。
//ADD CALENDAR EVENT
const { google } = require("googleapis");
const path = require("path"); // Added
// --- I added below script.
const key = require(path.join(__dirname, 'credentials.json'));
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
["https://www.googleapis.com/auth/calendar"],
null
);
const calendar = google.calendar({ version: "v3", auth: jwtClient });
// ---
//Create Calendar Event
function addEvent(event) {
return new Promise(function(resolve, reject) {
calendar.events.insert(
{
calendarId: "primary",
resource: {
summary: event.eventName,
description: event.description,
start: {
dateTime: event.startTime,
timeZone: TIME_ZONE
},
end: {
dateTime: event.endTime,
timeZone: TIME_ZONE
}
}
},
(err, res) => {
if (err) {
console.log("Rejecting because of error");
reject(err);
return;
}
console.log("Request successful");
resolve(res.data);
}
);
});
}
//Add Event To Service Acount
exports.addEventToCalendar = functions.https.onRequest((request, response) => {
const eventData = {
eventName: request.body.eventName,
description: request.body.description,
startTime: request.body.startTime,
endTime: request.body.endTime
};
addEvent(eventData) // Modified
.then(data => {
response.status(200).send(data);
return;
})
.catch(err => {
console.error("Error adding event: " + err.message);
response.status(500).send(ERROR_RESPONSE);
return;
});
});