From ca62ab23a5baa51173623e775b7817d7e648e743 Mon Sep 17 00:00:00 2001 From: Thomas Lombart Date: Thu, 11 Jul 2024 12:02:51 +0200 Subject: [PATCH] OAuth: Fix refresh token flow to log out user --- docs/utils-reference/getting-started.md | 4 ++++ package.json | 2 +- src/oauth/OAuthService.ts | 20 ++++++++++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/utils-reference/getting-started.md b/docs/utils-reference/getting-started.md index 3f6189d..e4b3b6f 100644 --- a/docs/utils-reference/getting-started.md +++ b/docs/utils-reference/getting-started.md @@ -16,6 +16,10 @@ npm install --save @raycast/utils ## Changelog +### v1.16.2 + +- Fixed the refresh token flow to log out the user instead of throwing an error. + ### v1.16.1 - Fixed an issue where `bodyEncoding` wasn't properly used in OAuthService. diff --git a/package.json b/package.json index b4f0015..ed9b2d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@raycast/utils", - "version": "1.16.1", + "version": "1.16.2", "description": "Set of utilities to streamline building Raycast extensions", "author": "Raycast Technologies Ltd.", "homepage": "https://developers.raycast.com/utils-reference", diff --git a/src/oauth/OAuthService.ts b/src/oauth/OAuthService.ts index c15801a..c3f3d83 100644 --- a/src/oauth/OAuthService.ts +++ b/src/oauth/OAuthService.ts @@ -176,8 +176,12 @@ export class OAuthService implements OAuthServiceOptions { const tokens = await this.refreshTokens({ token: currentTokenSet.refreshToken, }); - await this.client.setTokens(tokens); - return tokens.access_token; + + // In the case where the refresh token flows fails, nothing is returned and the authorize function is called again. + if (tokens) { + await this.client.setTokens(tokens); + return tokens.access_token; + } } return currentTokenSet.accessToken; } @@ -266,10 +270,14 @@ export class OAuthService implements OAuthServiceOptions { if (!response.ok) { const responseText = await response.text(); console.error("refresh tokens error:", responseText); - throw new Error(`Error while refreshing tokens: ${response.status} (${response.statusText})\n${responseText}`); + // If the refresh token is invalid, stop the flow here, log out the user and prompt them to re-authorize. + this.client.description = `${this.client.providerName} needs you to sign-in again. Press ⏎ or click the button below to continue.`; + await this.client.removeTokens(); + await this.authorize(); + } else { + const tokenResponse = this.tokenRefreshResponseParser(await response.json()); + tokenResponse.refresh_token = tokenResponse.refresh_token ?? token; + return tokenResponse; } - const tokenResponse = this.tokenRefreshResponseParser(await response.json()); - tokenResponse.refresh_token = tokenResponse.refresh_token ?? token; - return tokenResponse; } }