From 2ea18330effe8b4a35081ddb0dfbeab74e576944 Mon Sep 17 00:00:00 2001 From: Anna Romanova Date: Tue, 18 Feb 2025 16:43:17 -0800 Subject: [PATCH 1/2] Fix issue with refreshing token when client_secret is not set --- dist/OAuth2.gs | 1 - src/Service.js | 1 - test/test.js | 25 +++++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/dist/OAuth2.gs b/dist/OAuth2.gs index adf3bb84..ce97757c 100644 --- a/dist/OAuth2.gs +++ b/dist/OAuth2.gs @@ -759,7 +759,6 @@ Service_.prototype.ensureExpiresAtSet_ = function(token) { Service_.prototype.refresh = function() { validate_({ 'Client ID': this.clientId_, - 'Client Secret': this.clientSecret_, 'Token URL': this.tokenUrl_ }); diff --git a/src/Service.js b/src/Service.js index 68bd3e7f..e7527fe1 100644 --- a/src/Service.js +++ b/src/Service.js @@ -666,7 +666,6 @@ Service_.prototype.ensureExpiresAtSet_ = function(token) { Service_.prototype.refresh = function() { validate_({ 'Client ID': this.clientId_, - 'Client Secret': this.clientSecret_, 'Token URL': this.tokenUrl_ }); diff --git a/test/test.js b/test/test.js index 1e8317f7..6fa5822a 100644 --- a/test/test.js +++ b/test/test.js @@ -387,6 +387,31 @@ describe('Service', () => { done(); }); + it('should refresh token granted for PKCE', (done) => { + var token = { + granted_time: 100, + expires_in: 0, + refresh_token: 'bar' + }; + var properties = new MockProperties({ + 'oauth2.test': JSON.stringify(token) + }); + + mocks.UrlFetchApp.resultFunction = () => JSON.stringify({ + access_token: Math.random().toString(36) + }); + + OAuth2.createService('test') + .setClientId('test') + .setTokenUrl('http://www.example.com') + .setPropertyStore(properties) + .refresh(); + + var storedToken = JSON.parse(properties.getProperty('oauth2.test')); + assert.equal(storedToken.refresh_token, 'bar'); + done(); + }); + it('should retain refresh expiry', () => { const NOW_SECONDS = OAuth2.getTimeInSeconds_(new Date()); const ONE_HOUR_AGO_SECONDS = NOW_SECONDS - 360; From 82727f9c2510afab729dbe3c059c462172f58ba4 Mon Sep 17 00:00:00 2001 From: Anna Romanova Date: Wed, 19 Feb 2025 09:45:19 -0800 Subject: [PATCH 2/2] check that refreshed token has refreshTokenExpiresAt set --- test/test.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/test.js b/test/test.js index 6fa5822a..fe7aca71 100644 --- a/test/test.js +++ b/test/test.js @@ -387,11 +387,14 @@ describe('Service', () => { done(); }); - it('should refresh token granted for PKCE', (done) => { + it('should refresh token granted for PKCE', () => { + const NOW_SECONDS = OAuth2.getTimeInSeconds_(new Date()); + const ONE_HOUR_AGO_SECONDS = NOW_SECONDS - 360; var token = { - granted_time: 100, - expires_in: 0, - refresh_token: 'bar' + granted_time: ONE_HOUR_AGO_SECONDS, + expires_in: 100, + refresh_token: 'bar', + refresh_token_expires_in: 720 }; var properties = new MockProperties({ 'oauth2.test': JSON.stringify(token) @@ -405,11 +408,12 @@ describe('Service', () => { .setClientId('test') .setTokenUrl('http://www.example.com') .setPropertyStore(properties) + .generateCodeVerifier() .refresh(); var storedToken = JSON.parse(properties.getProperty('oauth2.test')); assert.equal(storedToken.refresh_token, 'bar'); - done(); + assert.equal(storedToken.refreshTokenExpiresAt, NOW_SECONDS + 360); }); it('should retain refresh expiry', () => {