Google Calendar API Nodejs - 服务帐户 - 委派

时间:2016-06-01 10:58:23

标签: google-calendar-api google-apps google-api-nodejs-client

我是 Google Apps 域名的suadmin,正在使用Calendar API。日历应用程序在管理控制台中标记为已激活。共享参数:通过管理日历应用程序控制台共享所有信息而无需内部和外部用户的修改权限。我创建了一个共享资源并订阅了它的议程。为了简化,我分享了每个人的可用性信息议程。

我实现了一个应用程序,以不同的方式来找到最好的 - 对我来说。通过Google App脚本(HTML),浏览器端脚本和nodejs服务器端脚本(浏览器端授权),一切正常。始终要求用户通过Google登录和权限对话框以交互方式授予访问权限。

现在我想要一个nodejs 服务器端应用程序具有委派访问权限到议程(即共享资源),而用户不必以交互方式授予访问权限。所以我使用服务帐户。现在去代码。

因此创建了项目,我激活了日历API,验证了源代码(google-verification页面由nodejs express脚本提供静态http://ip:8080并经过验证)。域验证并不真正使用sens(没有反向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: [] }

服务帐户没有议程,所以它不一定是一个惊喜,但是,我认为通过委派访问,我将获得域中所有议程的列表(用户和资源)。

  1. 所以我的第一个问题是为什么这里没有列出日历?
  2. 现在我要列出我自己议程中即将发生的事件(我是服务帐户的所有者)。

    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
    
    1. 我的第二个问题是为什么我无法访问我的用户日历 事件,即使我明确指定了ID?

    2. 我的最后一个问题是关于访问共享资源的问题 议程和活动? (mydomain.tld_xxxxxxxx@resource.calendar.google.com)

    3. 感谢您的帮助,我会关注该问题

1 个答案:

答案 0 :(得分:2)

(代表OP发布)。

即使日历是公开共享的,也必须明确设置服务帐户的电子邮件地址以便共享每个日历。