首页 > 解决方案 > Node.js 的 GoogleAPIs,如何在没有浏览器和人工交互的情况下在服务器上对用户进行 oauth2

问题描述

问题:

我正在创建简单的后端应用程序,它将检查我的谷歌日历帐户上的一些事情。我希望它每周运行一次 api 调用。

日历 api 需要使用 oAuth2。我发现的所有示例都需要人工交互流程:

  1. 运行方法
  2. 服务器要求用户在特殊 url 上打开浏览器并复制那里显示的代码
  3. 用户这样做并将代码粘贴到控制台中
  4. 服务器对其进行验证并将令牌保存到某个文件
  5. 服务器执行日历 api 调用

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

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

到目前为止我尝试了什么:我显然是从这里开始的。它有效,但我必须使用浏览器。

然后我找到了google-auth-library-nodejs。但这默认为 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)。

这个怎么做?

标签: node.jsoauth-2.0google-api

解决方案


如果您想代表用户(甚至是您自己的用户)发出请求,您必须获得一个 oauth 令牌。

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

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


推荐阅读