Skip to content

Commit 0af446c

Browse files
fix(oidc-client): tokens refresh conflict multiple tabs
1 parent 216adc7 commit 0af446c

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

packages/oidc-client/src/initSession.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const initSession = (configurationName, storage = sessionStorage) => {
4242
return { nonce: storage[`oidc.nonce.${configurationName}`] };
4343
};
4444

45-
const setDemonstratingProofOfPossessionNonce = (dpopNonce:string) => {
45+
const setDemonstratingProofOfPossessionNonce = async (dpopNonce:string) => {
4646
storage[`oidc.dpop_nonce.${configurationName}`] = dpopNonce;
4747
};
4848

packages/oidc-client/src/initWorker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,16 +157,16 @@ export const initWorkerAsync = async(configuration, configurationName) => {
157157
return getLoginParamsCache[configurationName];
158158
};
159159

160-
const setDemonstratingProofOfPossessionNonce = (demonstratingProofOfPossessionNonce: string) => {
161-
sendMessageAsync(registration)({ type: 'setDemonstratingProofOfPossessionNonce', data: { demonstratingProofOfPossessionNonce }, configurationName });
160+
const setDemonstratingProofOfPossessionNonce = async (demonstratingProofOfPossessionNonce: string) => {
161+
await sendMessageAsync(registration)({ type: 'setDemonstratingProofOfPossessionNonce', data: { demonstratingProofOfPossessionNonce }, configurationName });
162162
};
163163

164164
const getDemonstratingProofOfPossessionNonce = async () => {
165165
const result = await sendMessageAsync(registration)({type: 'getDemonstratingProofOfPossessionNonce', data: null, configurationName});
166166
return result.demonstratingProofOfPossessionNonce;
167167
};
168168

169-
const setDemonstratingProofOfPossessionJwkAsync = (demonstratingProofOfPossessionJwk:string) => {
169+
const setDemonstratingProofOfPossessionJwkAsync = async (demonstratingProofOfPossessionJwk:string) => {
170170
const demonstratingProofOfPossessionJwkJson = JSON.stringify(demonstratingProofOfPossessionJwk);
171171
sendMessageAsync(registration)({ type: 'setDemonstratingProofOfPossessionJwk', data: { demonstratingProofOfPossessionJwkJson }, configurationName });
172172
};

packages/oidc-client/src/renewTokens.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,30 @@ import timer from './timer.js';
66
import { StringMap } from './types.js';
77

88
export async function renewTokensAndStartTimerAsync(oidc, refreshToken, forceRefresh = false, extras:StringMap = null) {
9-
const updateTokens = (tokens) => { oidc.tokens = tokens; };
10-
const { tokens, status } = await oidc.synchroniseTokensAsync(refreshToken, 0, forceRefresh, extras, updateTokens);
119

12-
const serviceWorker = await initWorkerAsync(oidc.configuration, oidc.configurationName);
13-
if (!serviceWorker) {
14-
const session = initSession(oidc.configurationName, oidc.configuration.storage);
15-
await session.setTokens(oidc.tokens);
16-
}
10+
const configuration = oidc.configuration;
11+
const lockResourcesName = `${configuration.client_id}_${oidc.configurationName}_${configuration.authority}`;
12+
const tokens = await navigator.locks.request(lockResourcesName, async (lock) => {
13+
const updateTokens = (tokens) => {
14+
oidc.tokens = tokens;
15+
};
16+
const {tokens, status} = await oidc.synchroniseTokensAsync(refreshToken, 0, forceRefresh, extras, updateTokens);
1717

18-
if (!oidc.tokens) {
19-
await oidc.destroyAsync(status);
20-
return;
21-
}
18+
const serviceWorker = await initWorkerAsync(oidc.configuration, oidc.configurationName);
19+
if (!serviceWorker) {
20+
const session = initSession(oidc.configurationName, oidc.configuration.storage);
21+
await session.setTokens(oidc.tokens);
22+
}
2223

24+
if (!oidc.tokens) {
25+
await oidc.destroyAsync(status);
26+
return null;
27+
}
28+
return tokens
29+
});
30+
if(!tokens){
31+
return null;
32+
}
2333
if (oidc.timeoutId) {
2434
oidc.timeoutId = autoRenewTokens(oidc, tokens.refreshToken, oidc.tokens.expiresAt, extras);
2535
}

0 commit comments

Comments
 (0)