Skip to content

Commit

Permalink
fix(oidc): sessions storage renew tokens (release) (#1230)
Browse files Browse the repository at this point in the history
* fix(oidc): sessions storage renew tokens (alpha)
  • Loading branch information
guillaume-chervet committed Dec 5, 2023
1 parent 826084a commit 96637a7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 24 deletions.
7 changes: 1 addition & 6 deletions packages/oidc-client/src/oidc.ts
Expand Up @@ -112,6 +112,7 @@ export class Oidc {
logout_tokens_to_invalidate: configuration.logout_tokens_to_invalidate ?? ['access_token', 'refresh_token'],
service_worker_update_require_callback,
service_worker_activate: configuration.service_worker_activate ?? activateServiceWorker,
storage: configuration.storage ?? sessionStorage,
};

this.getFetch = getFetch ?? getFetchDefault;
Expand Down Expand Up @@ -361,12 +362,6 @@ Please checkout that you are using OIDC hook inside a <OidcProvider configuratio
numberTryOnline--;
this.publishEvent(eventNames.refreshTokensAsync, { message: `wait because navigator is offline try ${numberTryOnline}` });
}
let numberTryHidden = Math.floor(Math.random() * 15) + 10;
while (document.hidden && numberTryHidden > 0) {
await sleepAsync({milliseconds: 1000});
numberTryHidden--;
this.publishEvent(eventNames.refreshTokensAsync, { message: `wait because navigator is hidden try ${numberTryHidden}` });
}
const isDocumentHidden = document.hidden;
const nextIndex = isDocumentHidden ? index : index + 1;
if (!extras) {
Expand Down
47 changes: 29 additions & 18 deletions packages/oidc-client/src/renewTokens.ts
Expand Up @@ -5,28 +5,39 @@ import { computeTimeLeft } from './parseTokens.js';
import timer from './timer.js';
import { StringMap } from './types.js';

async function syncTokens(oidc, refreshToken, forceRefresh: boolean, extras: StringMap) {
const updateTokens = (tokens) => {
oidc.tokens = tokens;
};
const {tokens, status} = await oidc.synchroniseTokensAsync(refreshToken, 0, forceRefresh, extras, updateTokens);

const serviceWorker = await initWorkerAsync(oidc.configuration, oidc.configurationName);
if (!serviceWorker) {
const session = initSession(oidc.configurationName, oidc.configuration.storage);
await session.setTokens(oidc.tokens);
}

if (!oidc.tokens) {
await oidc.destroyAsync(status);
return null;
}
return tokens;
}

export async function renewTokensAndStartTimerAsync(oidc, refreshToken, forceRefresh = false, extras:StringMap = null) {

const configuration = oidc.configuration;
const lockResourcesName = `${configuration.client_id}_${oidc.configurationName}_${configuration.authority}`;
const tokens = await navigator.locks.request(lockResourcesName, async (lock) => {
const updateTokens = (tokens) => {
oidc.tokens = tokens;
};
const {tokens, status} = await oidc.synchroniseTokensAsync(refreshToken, 0, forceRefresh, extras, updateTokens);

const serviceWorker = await initWorkerAsync(oidc.configuration, oidc.configurationName);
if (!serviceWorker) {
const session = initSession(oidc.configurationName, oidc.configuration.storage);
await session.setTokens(oidc.tokens);
}

if (!oidc.tokens) {
await oidc.destroyAsync(status);
return null;
}
return tokens
});

let tokens = null;
const serviceWorker = await initWorkerAsync(oidc.configuration, oidc.configurationName);
if(configuration.storage === window.sessionStorage && !serviceWorker) {
tokens = await syncTokens(oidc, refreshToken, forceRefresh, extras);
} else {
tokens = await navigator.locks.request(lockResourcesName, async (lock) => {
return await syncTokens(oidc, refreshToken, forceRefresh, extras);
});
}
if(!tokens){
return null;
}
Expand Down

0 comments on commit 96637a7

Please sign in to comment.