首页 > 解决方案 > 有人可以 ELI5 如何使用 node.js 正确执行离线 Google oauth2 吗?

问题描述

在浏览器中,我正在做:

      let { code } = await this.auth2.grantOfflineAccess();

然后我将其保存code在我的数据库中。

然后在服务器(node.js)上,我正在做:

const { tokens } = await oauth2Client.getToken(code)
oauth2Client.setCredentials(tokens)
let { data } = await googleCalendar.calendarList.list({
  auth: oauth2Client
})

第一次,tokens有一个refresh_token。我也保存了。当我运行一次时,它工作正常。当我再次运行它时,它说令牌无效。不知何故,我必须使用refresh_token, 来获取新令牌,但我不知道如何。有人可以解释一下我5岁吗?

谢谢

标签: javascriptnode.jsoauth-2.0google-oauth

解决方案


  • 您已经拥有刷新令牌。
  • 您希望将 API 与由刷新令牌刷新的访问令牌一起使用。
  • 您想使用 googleapis 和 Node.js 来实现这一点。

如果我的理解是正确的,这个答案怎么样?我认为您的问题的原因是授权码只能使用一次。因此需要使用刷新令牌检索访问令牌。在此答案中,访问令牌由刷新令牌检索。

修改后的脚本:

const refreshToken = "###";  // Please set your refresh token.

if (!refreshToken) { // Please modify this if statement for your situation.
  const { tokens } = await oauth2Client.getToken(code);
  oauth2Client.setCredentials(tokens);
} else {
  oauth2Client.credentials = { refresh_token: refreshToken };
}
let { data } = await googleCalendar.calendarList.list({
  auth: oauth2Client
});

笔记:

  • 这个修改后的脚本假定oauth2ClientgoogleCalendar声明了这一点。
  • 使用刷新令牌时,不需要授权码。

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。


推荐阅读