Google 日历 API Nodejs - 服务帐户 - 委派
Google Calendar API Nodejs - Service Account - Delegation
我是 Google 应用程序 域的管理员,正在处理日历 API。日历应用程序在管理控制台中被标记为对所有用户激活。共享参数:共享所有信息,无需内部和外部用户的修改权限 - 通过 Admin Calendar App Console。我创建了一个共享资源并订阅了它的议程。为简化起见,我为大家分享了议程,以获取可用性信息。
我实现了一个应用程序以不同的方式来计算最好的 - 对我来说。 Google App Script (HTML)、浏览器端脚本和 nodejs 服务器端脚本(浏览器端授权)一切正常。始终要求用户通过 google 登录和权限对话框以交互方式授予访问权限。
现在我想要一个 nodejs 服务器端应用程序,它具有对议程(即共享资源)的委派访问权限,而无需用户以交互方式授予访问权限。所以我使用的是 服务帐户 。现在开始编码。
因此项目已创建,我激活了日历 API,验证了来源(google-验证页面由 nodejs express 脚本提供静态 http://ip:8080 并已验证)。域验证并没有真正意义(没有反向 DNS 名称)。授权 URL 设置已设置但对服务器应用程序无用,它是为浏览器端应用程序设置的。
我创建了服务帐户,委托并获得了带有私钥的 json 文件并将其复制到服务器上。 OAuth2 客户端 创建良好,我授权客户端 ID 访问日历 API R/W。一切似乎都很好。
var google = require('googleapis')
var calendar = google.calendar('v3')
var scopes = ['https://www.googleapis.com/auth/calendar']
var key = require ('./xxx'); // private json
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, scopes, null );
jwtClient.authorize(function(err, token) {
if(err) { ... }
console.log('token',token);
listCalendars(jwtClient);
});
脚本正在获得授权,我获得了访问令牌。
{ access_token: 'xxxxxxxxxx',
token_type: 'Bearer',
expiry_date: 1464780030000,
refresh_token: 'jwt-placeholder' }
调用calendarList.list成功...
function listCalendars(auth) {
calendar.calendarList.list({ auth: auth }, function(err, response) {
if (err) { ... }
console.log(response);
listEvents(auth)
})
}
但没有项目
{ kind: 'calendar#calendarList',
etag: '"1464776865512000"',
nextSyncToken: 'xxxxxx',
items: [] }
服务帐户没有议程,所以这并不奇怪,但是,好吧,我认为通过委派访问我会得到域中所有议程(用户和资源)的列表。
- 所以我的第一个问题是为什么这里没有列出日历?
现在我想列出我自己议程中即将发生的事件(我是服务帐户的所有者)。
function listEvents(auth) {
calendar.events.list({
auth: auth,
// calendarId: 'primary',
calendarId: 'me@mydomain.tld',
timeMin: new Date().toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime'
}, function(err, response) {
if(err) { ... }
var events = response.items;
if(events.length == 0) { ... }
...
});
}
我收到一个错误
The API call returned an error: Error: Not Found
我的第二个问题是为什么我无法访问我的用户日历
事件,即使我明确指定了 ID ?
我的最后一个问题是关于获取共享资源的访问权限
议程和事件? (mydomain.tld_xxxxxxxx@resource.calendar.google.com)
感谢您的帮助,我会继续解决这个问题
(代表OP发帖)
必须明确设置服务帐户的电子邮件地址才能为每个日历共享,即使日历是公开共享的。
我是 Google 应用程序 域的管理员,正在处理日历 API。日历应用程序在管理控制台中被标记为对所有用户激活。共享参数:共享所有信息,无需内部和外部用户的修改权限 - 通过 Admin Calendar App Console。我创建了一个共享资源并订阅了它的议程。为简化起见,我为大家分享了议程,以获取可用性信息。
我实现了一个应用程序以不同的方式来计算最好的 - 对我来说。 Google App Script (HTML)、浏览器端脚本和 nodejs 服务器端脚本(浏览器端授权)一切正常。始终要求用户通过 google 登录和权限对话框以交互方式授予访问权限。
现在我想要一个 nodejs 服务器端应用程序,它具有对议程(即共享资源)的委派访问权限,而无需用户以交互方式授予访问权限。所以我使用的是 服务帐户 。现在开始编码。
因此项目已创建,我激活了日历 API,验证了来源(google-验证页面由 nodejs express 脚本提供静态 http://ip:8080 并已验证)。域验证并没有真正意义(没有反向 DNS 名称)。授权 URL 设置已设置但对服务器应用程序无用,它是为浏览器端应用程序设置的。
我创建了服务帐户,委托并获得了带有私钥的 json 文件并将其复制到服务器上。 OAuth2 客户端 创建良好,我授权客户端 ID 访问日历 API R/W。一切似乎都很好。
var google = require('googleapis')
var calendar = google.calendar('v3')
var scopes = ['https://www.googleapis.com/auth/calendar']
var key = require ('./xxx'); // private json
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, scopes, null );
jwtClient.authorize(function(err, token) {
if(err) { ... }
console.log('token',token);
listCalendars(jwtClient);
});
脚本正在获得授权,我获得了访问令牌。
{ access_token: 'xxxxxxxxxx',
token_type: 'Bearer',
expiry_date: 1464780030000,
refresh_token: 'jwt-placeholder' }
调用calendarList.list成功...
function listCalendars(auth) {
calendar.calendarList.list({ auth: auth }, function(err, response) {
if (err) { ... }
console.log(response);
listEvents(auth)
})
}
但没有项目
{ kind: 'calendar#calendarList',
etag: '"1464776865512000"',
nextSyncToken: 'xxxxxx',
items: [] }
服务帐户没有议程,所以这并不奇怪,但是,好吧,我认为通过委派访问我会得到域中所有议程(用户和资源)的列表。
- 所以我的第一个问题是为什么这里没有列出日历?
现在我想列出我自己议程中即将发生的事件(我是服务帐户的所有者)。
function listEvents(auth) {
calendar.events.list({
auth: auth,
// calendarId: 'primary',
calendarId: 'me@mydomain.tld',
timeMin: new Date().toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime'
}, function(err, response) {
if(err) { ... }
var events = response.items;
if(events.length == 0) { ... }
...
});
}
我收到一个错误
The API call returned an error: Error: Not Found
我的第二个问题是为什么我无法访问我的用户日历 事件,即使我明确指定了 ID ?
我的最后一个问题是关于获取共享资源的访问权限 议程和事件? (mydomain.tld_xxxxxxxx@resource.calendar.google.com)
感谢您的帮助,我会继续解决这个问题
(代表OP发帖)
必须明确设置服务帐户的电子邮件地址才能为每个日历共享,即使日历是公开共享的。