Google API for Node.js,如何在没有浏览器和人工交互的情况下在服务器上认证用户

时间:2018-10-12 21:19:26

标签: node.js oauth-2.0 google-api

问题:

我正在创建简单的仅后端应用程序,它将检查我的Google日历帐户中的某些内容。我希望它每周运行一次api调用。

日历api需要使用oAuth2。我发现的所有示例都需要人与人之间的互动:

  1. 运行方法
  2. 服务器要求用户打开特殊网址的浏览器并复制显示在其中的代码
  3. 用户执行此操作,然后将代码粘贴到控制台中
  4. 服务器对其进行验证并将令牌保存到某些文件
  5. 服务器执行日历api调用

问题是我不想每周都这样做。我希望它进行一次身份验证,然后在无人看管的情况下运行。

一种方法是将令牌到期日期设置为1周以上,然后在每次调用时刷新它。但这在某些情况下(例如断电)无法恢复连接。

到目前为止我尝试过的是: 我显然开始here。可以,但是我必须使用浏览器。

然后我发现了google-auth-library-nodejs。但这默认为JWT,因此JWT无法与日历一起使用。也许我做错了:

private async initApiKey() {
    const client = await auth.getClient();
    const calendar = await google.calendar({version: 'v3', client});
    const events = await calendar.events.list({
      calendarId: 'primary',
      timeMin: (new Date()).toISOString(),
      maxResults: 10,
      singleEvents: true,
      orderBy: 'startTime',
    });
    return client;
  }

google.calendar应该传递给oauthclient,这里client是JWTClient。我猜我可以强制使用oAuth,但它可以强制使用浏览器(甚至使用opn)。

该怎么做?

1 个答案:

答案 0 :(得分:1)

如果要代表用户(甚至是您自己的用户)发出请求,则必须获取oauth令牌。

JWToken用于服务帐户,这些帐户不是实际用户,也没有日历。这些帐户代表Google Cloud Project或其他类型的对象执行API操作。

OAuth的目的是让用户明确同意允许由Google注册到应用程序的服务器代表他们进行API交互。您需要通过浏览器进行OAuth以获得令牌。刷新令牌可以在以后使用,以使该令牌保持最新状态。您可以存储这些令牌并在断电或其他重启事件后刷新。