Google操作 - 使用访问令牌访问Calendar API失败

时间:2017-06-16 12:50:31

标签: google-api google-calendar-api google-oauth google-oauth2 actions-on-google

我按照说明in this great post设置了我的应用服务器和Google操作之间的帐户关联。

在身份验证过程中,我请求了“https://www.googleapis.com/auth/calendar”范围权限。

我设法通过调用

在我的服务器上获取身份验证令牌
app.getUser().accessToken

但是当我向googleapi日历提出请求时,使用这段代码:

const google = require('googleapis');
var calendar = google.calendar('v3');

var eventData = {
    auth: myAuthToken,
    calendarId: 'primary',
    resource: {
        'summary': 'My Event',
        'description': 'Event desc',
        'start': {
            'dateTime': '2017-06-11',
        },
        'transparency': 'transparent',
        'visibility': 'private',
        'colorId': 'blue'
    }
};

calendar.events.insert(eventData, 
  function(err, event) {
    if (err) {
      console.log(err)
    }
});

我得到的是这个错误:

{ Error: Login Required
    at Request._callback (\node_modules\google-auth-library\lib\transporters.js:85:15)
    at Request.self.callback (\node_modules\request\request.js:188:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request.<anonymous> (\node_modules\request\request.js:1171:10)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at IncomingMessage.<anonymous> (\node_modules\request\request.js:1091:12)
    at IncomingMessage.g (events.js:291:16)
    at emitNone (events.js:91:20)
  code: 401,
  errors:
   [ { domain: 'global',
       reason: 'required',
       message: 'Login Required',
       locationType: 'header',
       location: 'Authorization' } ] }

我应该遵循其他任何身份验证步骤吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于您使用auth参数的结构不正确。您传递的是字符串标记,而它应该是OAuth2对象。有关详细信息,请参阅https://github.com/google/google-api-nodejs-client#making-authenticated-requests,但简而言之,您需要:

  1. 创建OAuth2对象
  2. 
    var OAuth2 = google.auth.OAuth2;
    var oauth2Client = new OAuth2(
      YOUR_CLIENT_ID,
      YOUR_CLIENT_SECRET,
      YOUR_REDIRECT_URL
    );
    
    1. 设置凭据(访问令牌)。
    2. 
      oauth2Client.setCredentials({
        access_token: 'ACCESS TOKEN HERE'
      });
      
      1. 在事件数据/通话中的oauth2Client参数中使用此auth对象。
      2. 
        var eventData = {
            auth: oauth2Client,
            ...
        };