Skip to content

Commit 90b8528

Browse files
authored
Merge pull request #159 from accounts-js/feature/client-refresh-token
refresh session check accessToken still valid first in order to not refresh the session each time
2 parents 54b2ed0 + ccc7920 commit 90b8528

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

packages/client/__tests__/accounts-client.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,14 +340,41 @@ describe('Accounts', () => {
340340
}
341341
});
342342

343+
it('should do nothing if tokens are still valid', async () => {
344+
Accounts.config({}, mockTransport);
345+
const accessToken = jwt.sign({ data: 'oldRefreshToken' }, 'secret', {
346+
expiresIn: 10,
347+
});
348+
const refreshToken = jwt.sign({ data: 'oldRefreshToken' }, 'secret', {
349+
expiresIn: '1d',
350+
});
351+
const oldTokens = {
352+
accessToken,
353+
refreshToken,
354+
};
355+
Accounts.instance.storeTokens(oldTokens);
356+
// tslint:disable-next-line no-string-literal
357+
Accounts.instance['store'].dispatch(setTokens(oldTokens));
358+
await Accounts.refreshSession();
359+
expect(localStorage.getItem('accounts:accessToken')).toEqual(accessToken);
360+
expect(localStorage.getItem('accounts:refreshToken')).toEqual(
361+
refreshToken
362+
);
363+
});
364+
343365
it('requests a new token pair, sets the tokens and the user', async () => {
344366
Accounts.config({}, mockTransport);
367+
const accessToken = jwt.sign({ data: 'oldRefreshToken' }, 'secret', {
368+
expiresIn: -10,
369+
});
370+
const refreshToken = jwt.sign({ data: 'oldRefreshToken' }, 'secret', {
371+
expiresIn: '1d',
372+
});
345373
const oldTokens = {
346-
accessToken: 'oldAccessToken',
347-
refreshToken: jwt.sign({ data: 'oldRefreshToken' }, 'secret', {
348-
expiresIn: '1d',
349-
}),
374+
accessToken,
375+
refreshToken,
350376
};
377+
Accounts.instance.storeTokens(oldTokens);
351378
// tslint:disable-next-line no-string-literal
352379
Accounts.instance['store'].dispatch(setTokens(oldTokens));
353380
await Accounts.refreshSession();

packages/client/src/accounts-client.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,22 +251,25 @@ export class AccountsClient {
251251
if (accessToken && refreshToken) {
252252
try {
253253
this.store.dispatch(loggingIn(true));
254-
const decodedRefreshToken = jwtDecode(refreshToken);
255254
const currentTime = Date.now() / 1000;
256-
// Refresh token is expired, user must sign back in
257-
if (decodedRefreshToken.exp < currentTime) {
258-
this.clearTokens();
259-
} else {
255+
256+
const decodedAccessToken = jwtDecode(accessToken);
257+
const decodedRefreshToken = jwtDecode(refreshToken);
258+
// See if accessToken is expired
259+
if (decodedAccessToken.exp < currentTime) {
260260
// Request a new token pair
261261
const refreshedSession: LoginReturnType = await this.transport.refreshTokens(
262262
accessToken,
263263
refreshToken
264264
);
265-
this.store.dispatch(loggingIn(false));
266265

267266
await this.storeTokens(refreshedSession.tokens);
268267
this.store.dispatch(setTokens(refreshedSession.tokens));
268+
} else if (decodedRefreshToken.exp < currentTime) {
269+
// Refresh token is expired, user must sign back in
270+
this.clearTokens();
269271
}
272+
this.store.dispatch(loggingIn(false));
270273
} catch (err) {
271274
this.store.dispatch(loggingIn(false));
272275
this.clearTokens();

0 commit comments

Comments
 (0)