我是Google Apps域的suadmin,负责处理Calendar API。日历应用程序被标记为在管理控制台中为所有用户激活。共享参数:通过管理日历应用程序控制台共享所有信息,无需修改内部和外部用户的权限。我创建了一个共享资源并订阅了它的议程。为了简化,我与大家分享了可用性信息的议程。Google日历API Nodejs - 服务帐户 - 代理
我实现了一个应用程序不同的方式来找到最好的 - 对我来说。从Google App脚本(HTML),浏览器端脚本和nodejs服务器端脚本(浏览器端授权),一切工作正常。用户总是被要求通过Google登录和权限对话框交互授予访问权限。
现在我想要一个nodejs 服务器端应用程序与委派访问议程(即共享资源),而用户不必交互授予访问权限。所以我使用服务帐户。现在去代码。
所以创建项目后,我激活了日历API,验证了源代码(通过nodejs express脚本验证了谷歌验证页面为静态http://ip:8080并进行了验证)。域验证并不真正做出反应(没有反向DNS名称)。授权URL设置已设置,但对服务器应用程序无效,它是为浏览器端应用程序设置的。
我创建了服务帐户,使用委托并获取带有私钥的json文件并将其复制到服务器上。 OAuth2客户端创建得很好,我授权客户端ID访问Calendar 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: '[email protected]',
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明确?
我的最后一个问题将是有关获取共享资源 议程和活动的访问? ([email protected])
感谢您的帮助,我会遵循这个问题
没问题,我去掉最大胆的部分 – Gil
看起来像你必须明确地添加的服务帐户的电子邮件地址(议程共享参数),即使你设置的公共共享功能,事件如果授予的所有@您的访问域 – Gil