无法使用 Node.js 验证 google 服务帐户
Can't authenticate google service account using Node.js
我的目标是允许人们通过我的网站(目前使用 Firebase)将事件添加到日历。我正在尝试允许他们将事件添加到服务帐户;但是,我在对服务帐户进行身份验证时遇到了问题。当我尝试部署我的代码时,我在 await google.auth.getClient 部分收到 'unexpected token google' 错误。我在全球安装了 google API 工具。
//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;
});
});
我一直在学习这两个教程的组合:
https://medium.com/zero-equals-false/integrating-firebase-cloud-functions-with-google-calendar-api-9a5ac042e869
https://dev.to/mornir/create-a-service-account-to-authenticate-with-google-5b1k
我花了很多时间在谷歌上搜索可能出了什么问题,但老实说,这个 google 身份验证的东西让我很困惑。如果能得到任何帮助,我将不胜感激,谢谢:)
- 您想使用服务帐户在 Google 日历中创建新活动。
credentials.json
是服务账号的凭证文件。
- 您想使用带有 Node.js 的 googleapis 来实现此目的。
- 您已经可以使用日历 API。
如果我的理解是正确的,这个修改怎么样?请将此视为几个可能的答案之一。
修改点:
- 使用服务帐号时,可以使用
google.auth.JWT
代替google.auth.getClient
。
- 在您的脚本中,
client
被赋予 addEvent(eventData, client)
。但是在function addEvent(event) {}
,client
没有被使用。
- 关于
path.join(__dirname, 'credentials.json';
,需要补充)
。而且我认为const path = require("path");
也需要添加。
修改后的脚本:
//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;
});
});
注:
- 此修改后的脚本假定
request.body
的对象可用于 calendar.events.insert()
的 resource
。
TIME_ZONE
是否在别处申报?请注意这一点。
- 当服务帐户的电子邮件未与 Google 电子表格共享时,无法创建事件。所以请注意这一点。
参考文献:
如果我误解了你的情况,这不是你想要的方向,我很抱歉。
我的目标是允许人们通过我的网站(目前使用 Firebase)将事件添加到日历。我正在尝试允许他们将事件添加到服务帐户;但是,我在对服务帐户进行身份验证时遇到了问题。当我尝试部署我的代码时,我在 await google.auth.getClient 部分收到 'unexpected token google' 错误。我在全球安装了 google API 工具。
//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;
});
});
我一直在学习这两个教程的组合: https://medium.com/zero-equals-false/integrating-firebase-cloud-functions-with-google-calendar-api-9a5ac042e869 https://dev.to/mornir/create-a-service-account-to-authenticate-with-google-5b1k
我花了很多时间在谷歌上搜索可能出了什么问题,但老实说,这个 google 身份验证的东西让我很困惑。如果能得到任何帮助,我将不胜感激,谢谢:)
- 您想使用服务帐户在 Google 日历中创建新活动。
credentials.json
是服务账号的凭证文件。- 您想使用带有 Node.js 的 googleapis 来实现此目的。
- 您已经可以使用日历 API。
如果我的理解是正确的,这个修改怎么样?请将此视为几个可能的答案之一。
修改点:
- 使用服务帐号时,可以使用
google.auth.JWT
代替google.auth.getClient
。 - 在您的脚本中,
client
被赋予addEvent(eventData, client)
。但是在function addEvent(event) {}
,client
没有被使用。 - 关于
path.join(__dirname, 'credentials.json';
,需要补充)
。而且我认为const path = require("path");
也需要添加。
修改后的脚本:
//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;
});
});
注:
- 此修改后的脚本假定
request.body
的对象可用于calendar.events.insert()
的resource
。 TIME_ZONE
是否在别处申报?请注意这一点。- 当服务帐户的电子邮件未与 Google 电子表格共享时,无法创建事件。所以请注意这一点。
参考文献:
如果我误解了你的情况,这不是你想要的方向,我很抱歉。