1

In the browser, I'm doing:

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

I then save that code in my DB.

Then on the server (node.js), I'm doing:

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

The first time, tokens has a refresh_token. I save that as well. When I run this once, it works fine. When I run it again, it says the token is invalid. Somehow, I have to use the refresh_token, to get a new token, but I don't know how. Can someone please explain like I'm 5?

Thanks

Shamoon
  • 41,293
  • 91
  • 306
  • 570

1 Answers1

1
  • You have already had the refresh token.
  • You want to use the API with the access token refreshed by the refresh token.
  • You want to achieve this using googleapis with Node.js.

If my understanding is correct, how about this answer? I think that the reason of your issue is that the authorization code can be used only one time. So it is required to retrieve the access token using the refresh token. In this answer, the access token is retrieved by the refresh token.

Modified script:

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
});

Note:

  • This modified script supposes that oauth2Client and googleCalendar are declared.
  • When the refresh token is used, the authorization code is not required.

Reference:

If I misunderstood your question and this was not the result you want, I apologize.

Tanaike
  • 181,128
  • 11
  • 97
  • 165
  • Will I get a new refresh token after using a refresh token? – Shamoon Sep 06 '19 at 10:30
  • @Shamoon Thank you for replying. Unfortunately, the refresh token cannot be retrieved by the refresh token. The refresh token is used for refreshing the access token. But the refreshed access token is changed from before the refresh. Please be careful this. When you want to retrieve new refresh token, please use the authorization code. About the expiration of refresh token, is this thread useful? https://stackoverflow.com/q/8953983/7108653 – Tanaike Sep 06 '19 at 11:24