@axa-fr/react-oidc 6.15.9 → 6.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/{copy.js → copy.cjs} +5 -2
- package/dist/service_worker/OidcServiceWorker.d.ts +2 -0
- package/dist/service_worker/OidcServiceWorker.d.ts.map +1 -0
- package/dist/service_worker/OidcServiceWorker.js +369 -0
- package/dist/service_worker/OidcServiceWorker.js.map +1 -0
- package/dist/service_worker/constants.d.ts +18 -0
- package/dist/service_worker/constants.d.ts.map +1 -0
- package/dist/service_worker/types.d.ts +80 -0
- package/dist/service_worker/types.d.ts.map +1 -0
- package/dist/service_worker/utils/domains.d.ts +6 -0
- package/dist/service_worker/utils/domains.d.ts.map +1 -0
- package/dist/service_worker/utils/index.d.ts +6 -0
- package/dist/service_worker/utils/index.d.ts.map +1 -0
- package/dist/service_worker/utils/serializeHeaders.d.ts +3 -0
- package/dist/service_worker/utils/serializeHeaders.d.ts.map +1 -0
- package/dist/service_worker/utils/sleep.d.ts +3 -0
- package/dist/service_worker/utils/sleep.d.ts.map +1 -0
- package/dist/service_worker/utils/strings.d.ts +8 -0
- package/dist/service_worker/utils/strings.d.ts.map +1 -0
- package/dist/service_worker/utils/tokens.d.ts +12 -0
- package/dist/service_worker/utils/tokens.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/service_worker/.eslintrc.cjs +18 -0
- package/service_worker/OidcServiceWorker.ts +387 -0
- package/service_worker/constants.ts +32 -0
- package/service_worker/dist/OidcServiceWorker.d.ts +2 -0
- package/service_worker/dist/OidcServiceWorker.d.ts.map +1 -0
- package/service_worker/dist/OidcServiceWorker.js +369 -0
- package/service_worker/dist/OidcServiceWorker.js.map +1 -0
- package/service_worker/dist/constants.d.ts +18 -0
- package/service_worker/dist/constants.d.ts.map +1 -0
- package/service_worker/dist/types.d.ts +80 -0
- package/service_worker/dist/types.d.ts.map +1 -0
- package/service_worker/dist/utils/domains.d.ts +6 -0
- package/service_worker/dist/utils/domains.d.ts.map +1 -0
- package/service_worker/dist/utils/index.d.ts +6 -0
- package/service_worker/dist/utils/index.d.ts.map +1 -0
- package/service_worker/dist/utils/serializeHeaders.d.ts +3 -0
- package/service_worker/dist/utils/serializeHeaders.d.ts.map +1 -0
- package/service_worker/dist/utils/sleep.d.ts +3 -0
- package/service_worker/dist/utils/sleep.d.ts.map +1 -0
- package/service_worker/dist/utils/strings.d.ts +8 -0
- package/service_worker/dist/utils/strings.d.ts.map +1 -0
- package/service_worker/dist/utils/tokens.d.ts +12 -0
- package/service_worker/dist/utils/tokens.d.ts.map +1 -0
- package/service_worker/tsconfig.json +26 -0
- package/service_worker/types.ts +93 -0
- package/service_worker/utils/__tests__/domains.spec.ts +63 -0
- package/service_worker/utils/__tests__/serializeHeaders.spec.ts +11 -0
- package/service_worker/utils/__tests__/strings.spec.ts +9 -0
- package/service_worker/utils/__tests__/testHelper.ts +346 -0
- package/service_worker/utils/__tests__/tokens.spec.ts +68 -0
- package/service_worker/utils/domains.ts +95 -0
- package/service_worker/utils/index.ts +5 -0
- package/service_worker/utils/serializeHeaders.ts +12 -0
- package/service_worker/utils/sleep.ts +2 -0
- package/service_worker/utils/strings.ts +9 -0
- package/service_worker/utils/tokens.ts +198 -0
- package/dist/OidcServiceWorker.d.ts +0 -119
- package/dist/OidcServiceWorker.d.ts.map +0 -1
- package/dist/OidcServiceWorker.js +0 -498
- package/dist/OidcServiceWorker.js.map +0 -1
- /package/{dist → service_worker}/OidcTrustedDomains.js +0 -0
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const _self = self;
|
|
3
|
-
const scriptFilename = 'OidcTrustedDomains.js'; /* global trustedDomains */
|
|
4
|
-
_self.importScripts(scriptFilename);
|
|
5
|
-
const id = Math.round(new Date().getTime() / 1000).toString();
|
|
6
|
-
const acceptAnyDomainToken = '*';
|
|
7
|
-
const keepAliveJsonFilename = 'OidcKeepAliveServiceWorker.json';
|
|
8
|
-
const handleInstall = (event) => {
|
|
9
|
-
console.log('[OidcServiceWorker] service worker installed ' + id);
|
|
10
|
-
event.waitUntil(_self.skipWaiting());
|
|
11
|
-
};
|
|
12
|
-
const handleActivate = (event) => {
|
|
13
|
-
console.log('[OidcServiceWorker] service worker activated ' + id);
|
|
14
|
-
event.waitUntil(_self.clients.claim());
|
|
15
|
-
};
|
|
16
|
-
let currentLoginCallbackConfigurationName = null;
|
|
17
|
-
const database = {
|
|
18
|
-
default: {
|
|
19
|
-
configurationName: 'default',
|
|
20
|
-
tokens: null,
|
|
21
|
-
status: null,
|
|
22
|
-
state: null,
|
|
23
|
-
codeVerifier: null,
|
|
24
|
-
nonce: null,
|
|
25
|
-
oidcServerConfiguration: null,
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
const countLetter = (str, find) => {
|
|
29
|
-
return (str.split(find)).length - 1;
|
|
30
|
-
};
|
|
31
|
-
const b64DecodeUnicode = (str) => decodeURIComponent(Array.prototype.map.call(atob(str), (c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));
|
|
32
|
-
const parseJwt = (token) => JSON.parse(b64DecodeUnicode(token.split('.')[1].replace('-', '+').replace('_', '/')));
|
|
33
|
-
const extractTokenPayload = (token) => {
|
|
34
|
-
try {
|
|
35
|
-
if (!token) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
if (countLetter(token, '.') === 2) {
|
|
39
|
-
return parseJwt(token);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
catch (e) {
|
|
46
|
-
console.warn(e);
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
};
|
|
50
|
-
const computeTimeLeft = (refreshTimeBeforeTokensExpirationInSecond, expiresAt) => {
|
|
51
|
-
const currentTimeUnixSecond = new Date().getTime() / 1000;
|
|
52
|
-
return Math.round(((expiresAt - refreshTimeBeforeTokensExpirationInSecond) - currentTimeUnixSecond));
|
|
53
|
-
};
|
|
54
|
-
const isTokensValid = (tokens) => {
|
|
55
|
-
if (!tokens) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
return computeTimeLeft(0, tokens.expiresAt) > 0;
|
|
59
|
-
};
|
|
60
|
-
// https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation (excluding rules #1, #4, #5, #7, #8, #12, and #13 which did not apply).
|
|
61
|
-
// https://github.com/openid/AppAuth-JS/issues/65
|
|
62
|
-
const isTokensOidcValid = (tokens, nonce, oidcServerConfiguration) => {
|
|
63
|
-
if (tokens.idTokenPayload) {
|
|
64
|
-
const idTokenPayload = tokens.idTokenPayload;
|
|
65
|
-
// 2: The Issuer Identifier for the OpenID Provider (which is typically obtained during Discovery) MUST exactly match the value of the iss (issuer) Claim.
|
|
66
|
-
if (oidcServerConfiguration.issuer !== idTokenPayload.iss) {
|
|
67
|
-
return { isValid: false, reason: 'Issuer does not match' };
|
|
68
|
-
}
|
|
69
|
-
// 3: The Client MUST validate that the aud (audience) Claim contains its client_id value registered at the Issuer identified by the iss (issuer) Claim as an audience. The aud (audience) Claim MAY contain an array with more than one element. The ID Token MUST be rejected if the ID Token does not list the Client as a valid audience, or if it contains additional audiences not trusted by the Client.
|
|
70
|
-
// 6: If the ID Token is received via direct communication between the Client and the Token Endpoint (which it is in this flow), the TLS server validation MAY be used to validate the issuer in place of checking the token signature. The Client MUST validate the signature of all other ID Tokens according to JWS [JWS] using the algorithm specified in the JWT alg Header Parameter. The Client MUST use the keys provided by the Issuer.
|
|
71
|
-
// 9: The current time MUST be before the time represented by the exp Claim.
|
|
72
|
-
const currentTimeUnixSecond = new Date().getTime() / 1000;
|
|
73
|
-
if (idTokenPayload.exp && idTokenPayload.exp < currentTimeUnixSecond) {
|
|
74
|
-
return { isValid: false, reason: 'Token expired' };
|
|
75
|
-
}
|
|
76
|
-
// 10: The iat Claim can be used to reject tokens that were issued too far away from the current time, limiting the amount of time that nonces need to be stored to prevent attacks. The acceptable range is Client specific.
|
|
77
|
-
const timeInSevenDays = 60 * 60 * 24 * 7;
|
|
78
|
-
if (idTokenPayload.iat && (idTokenPayload.iat + timeInSevenDays) < currentTimeUnixSecond) {
|
|
79
|
-
return { isValid: false, reason: 'Token is used from too long time' };
|
|
80
|
-
}
|
|
81
|
-
// 11: If a nonce value was sent in the Authentication Request, a nonce Claim MUST be present and its value checked to verify that it is the same value as the one that was sent in the Authentication Request. The Client SHOULD check the nonce value for replay attacks. The precise method for detecting replay attacks is Client specific.
|
|
82
|
-
if (idTokenPayload.nonce && idTokenPayload.nonce !== nonce) {
|
|
83
|
-
return { isValid: false, reason: 'Nonce does not match' };
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return { isValid: true, reason: '' };
|
|
87
|
-
};
|
|
88
|
-
const TokenRenewMode = {
|
|
89
|
-
access_token_or_id_token_invalid: 'access_token_or_id_token_invalid',
|
|
90
|
-
access_token_invalid: 'access_token_invalid',
|
|
91
|
-
id_token_invalid: 'id_token_invalid',
|
|
92
|
-
};
|
|
93
|
-
function hideTokens(currentDatabaseElement) {
|
|
94
|
-
const configurationName = currentDatabaseElement.configurationName;
|
|
95
|
-
return (response) => {
|
|
96
|
-
if (response.status !== 200) {
|
|
97
|
-
return response;
|
|
98
|
-
}
|
|
99
|
-
return response.json().then((tokens) => {
|
|
100
|
-
if (!tokens.issued_at) {
|
|
101
|
-
const currentTimeUnixSecond = new Date().getTime() / 1000;
|
|
102
|
-
tokens.issued_at = currentTimeUnixSecond;
|
|
103
|
-
}
|
|
104
|
-
const accessTokenPayload = extractTokenPayload(tokens.access_token);
|
|
105
|
-
const secureTokens = {
|
|
106
|
-
...tokens,
|
|
107
|
-
access_token: ACCESS_TOKEN + '_' + configurationName,
|
|
108
|
-
accessTokenPayload,
|
|
109
|
-
};
|
|
110
|
-
tokens.accessTokenPayload = accessTokenPayload;
|
|
111
|
-
let _idTokenPayload = null;
|
|
112
|
-
if (tokens.id_token) {
|
|
113
|
-
_idTokenPayload = extractTokenPayload(tokens.id_token);
|
|
114
|
-
tokens.idTokenPayload = { ..._idTokenPayload };
|
|
115
|
-
if (_idTokenPayload.nonce && currentDatabaseElement.nonce != null) {
|
|
116
|
-
const keyNonce = NONCE_TOKEN + '_' + currentDatabaseElement.configurationName;
|
|
117
|
-
_idTokenPayload.nonce = keyNonce;
|
|
118
|
-
}
|
|
119
|
-
secureTokens.idTokenPayload = _idTokenPayload;
|
|
120
|
-
}
|
|
121
|
-
if (tokens.refresh_token) {
|
|
122
|
-
secureTokens.refresh_token = REFRESH_TOKEN + '_' + configurationName;
|
|
123
|
-
}
|
|
124
|
-
const idTokenExpiresAt = (_idTokenPayload && _idTokenPayload.exp) ? _idTokenPayload.exp : Number.MAX_VALUE;
|
|
125
|
-
const accessTokenExpiresAt = (accessTokenPayload && accessTokenPayload.exp) ? accessTokenPayload.exp : tokens.issued_at + tokens.expires_in;
|
|
126
|
-
let expiresAt;
|
|
127
|
-
const tokenRenewMode = currentDatabaseElement.oidcConfiguration.token_renew_mode;
|
|
128
|
-
if (tokenRenewMode === TokenRenewMode.access_token_invalid) {
|
|
129
|
-
expiresAt = accessTokenExpiresAt;
|
|
130
|
-
}
|
|
131
|
-
else if (tokenRenewMode === TokenRenewMode.id_token_invalid) {
|
|
132
|
-
expiresAt = idTokenExpiresAt;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
expiresAt = idTokenExpiresAt < accessTokenExpiresAt ? idTokenExpiresAt : accessTokenExpiresAt;
|
|
136
|
-
}
|
|
137
|
-
secureTokens.expiresAt = expiresAt;
|
|
138
|
-
tokens.expiresAt = expiresAt;
|
|
139
|
-
const nonce = currentDatabaseElement.nonce ? currentDatabaseElement.nonce.nonce : null;
|
|
140
|
-
const { isValid, reason } = isTokensOidcValid(tokens, nonce, currentDatabaseElement.oidcServerConfiguration); //TODO: Type assertion, could be null.
|
|
141
|
-
if (!isValid) {
|
|
142
|
-
throw Error(`Tokens are not OpenID valid, reason: ${reason}`);
|
|
143
|
-
}
|
|
144
|
-
// When refresh_token is not rotated we reuse ald refresh_token
|
|
145
|
-
if (currentDatabaseElement.tokens != null && 'refresh_token' in currentDatabaseElement.tokens && !('refresh_token' in tokens)) {
|
|
146
|
-
const refreshToken = currentDatabaseElement.tokens.refresh_token;
|
|
147
|
-
currentDatabaseElement.tokens = { ...tokens, refresh_token: refreshToken };
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
currentDatabaseElement.tokens = tokens;
|
|
151
|
-
}
|
|
152
|
-
currentDatabaseElement.status = 'LOGGED_IN';
|
|
153
|
-
const body = JSON.stringify(secureTokens);
|
|
154
|
-
return new Response(body, response);
|
|
155
|
-
});
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
const getCurrentDatabasesTokenEndpoint = (database, url) => {
|
|
159
|
-
const databases = [];
|
|
160
|
-
for (const [, value] of Object.entries(database)) {
|
|
161
|
-
if (value.oidcServerConfiguration != null && url.startsWith(value.oidcServerConfiguration.tokenEndpoint)) {
|
|
162
|
-
databases.push(value);
|
|
163
|
-
}
|
|
164
|
-
else if (value.oidcServerConfiguration != null && value.oidcServerConfiguration.revocationEndpoint && url.startsWith(value.oidcServerConfiguration.revocationEndpoint)) {
|
|
165
|
-
databases.push(value);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return databases;
|
|
169
|
-
};
|
|
170
|
-
const openidWellknownUrlEndWith = '/.well-known/openid-configuration';
|
|
171
|
-
const getCurrentDatabaseDomain = (database, url) => {
|
|
172
|
-
if (url.endsWith(openidWellknownUrlEndWith)) {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
for (const [key, currentDatabase] of Object.entries(database)) {
|
|
176
|
-
const oidcServerConfiguration = currentDatabase.oidcServerConfiguration;
|
|
177
|
-
if (!oidcServerConfiguration) {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
if (oidcServerConfiguration.tokenEndpoint && url === oidcServerConfiguration.tokenEndpoint) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
if (oidcServerConfiguration.revocationEndpoint && url === oidcServerConfiguration.revocationEndpoint) {
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
const domainsToSendTokens = oidcServerConfiguration.userInfoEndpoint
|
|
187
|
-
? [
|
|
188
|
-
oidcServerConfiguration.userInfoEndpoint, ...trustedDomains[key],
|
|
189
|
-
]
|
|
190
|
-
: [...trustedDomains[key]];
|
|
191
|
-
let hasToSendToken = false;
|
|
192
|
-
if (domainsToSendTokens.find((f) => f === acceptAnyDomainToken)) {
|
|
193
|
-
hasToSendToken = true;
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
for (let i = 0; i < domainsToSendTokens.length; i++) {
|
|
197
|
-
let domain = domainsToSendTokens[i];
|
|
198
|
-
if (typeof domain === 'string') {
|
|
199
|
-
domain = new RegExp(`^${domain}`);
|
|
200
|
-
}
|
|
201
|
-
if (domain.test?.(url)) {
|
|
202
|
-
hasToSendToken = true;
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
if (hasToSendToken) {
|
|
208
|
-
if (!currentDatabase.tokens) {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
return currentDatabase;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return null;
|
|
215
|
-
};
|
|
216
|
-
const serializeHeaders = (headers) => {
|
|
217
|
-
const headersObj = {};
|
|
218
|
-
for (const key of headers.keys()) {
|
|
219
|
-
if (headers.has(key)) {
|
|
220
|
-
headersObj[key] = headers.get(key);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return headersObj;
|
|
224
|
-
};
|
|
225
|
-
const REFRESH_TOKEN = 'REFRESH_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER';
|
|
226
|
-
const ACCESS_TOKEN = 'ACCESS_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER';
|
|
227
|
-
const NONCE_TOKEN = 'NONCE_SECURED_BY_OIDC_SERVICE_WORKER';
|
|
228
|
-
const CODE_VERIFIER = 'CODE_VERIFIER_SECURED_BY_OIDC_SERVICE_WORKER';
|
|
229
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
230
|
-
const keepAliveAsync = async (event) => {
|
|
231
|
-
const originalRequest = event.request;
|
|
232
|
-
const isFromVanilla = originalRequest.headers.has('oidc-vanilla');
|
|
233
|
-
const init = { status: 200, statusText: 'oidc-service-worker' };
|
|
234
|
-
const response = new Response('{}', init);
|
|
235
|
-
if (!isFromVanilla) {
|
|
236
|
-
for (let i = 0; i < 240; i++) {
|
|
237
|
-
await sleep(1000 + Math.floor(Math.random() * 1000));
|
|
238
|
-
const cache = await caches.open('oidc_dummy_cache');
|
|
239
|
-
await cache.put(event.request, response.clone());
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return response;
|
|
243
|
-
};
|
|
244
|
-
const handleFetch = async (event) => {
|
|
245
|
-
const originalRequest = event.request;
|
|
246
|
-
const url = originalRequest.url;
|
|
247
|
-
if (originalRequest.url.includes(keepAliveJsonFilename)) {
|
|
248
|
-
event.respondWith(keepAliveAsync(event));
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
const currentDatabaseForRequestAccessToken = getCurrentDatabaseDomain(database, originalRequest.url);
|
|
252
|
-
if (currentDatabaseForRequestAccessToken && currentDatabaseForRequestAccessToken.tokens && currentDatabaseForRequestAccessToken.tokens.access_token) {
|
|
253
|
-
while (currentDatabaseForRequestAccessToken.tokens && !isTokensValid(currentDatabaseForRequestAccessToken.tokens)) {
|
|
254
|
-
await sleep(200);
|
|
255
|
-
}
|
|
256
|
-
const newRequest = new Request(originalRequest, {
|
|
257
|
-
headers: {
|
|
258
|
-
...serializeHeaders(originalRequest.headers),
|
|
259
|
-
authorization: 'Bearer ' + currentDatabaseForRequestAccessToken.tokens.access_token,
|
|
260
|
-
},
|
|
261
|
-
mode: currentDatabaseForRequestAccessToken.oidcConfiguration.service_worker_convert_all_requests_to_cors ? 'cors' : originalRequest.mode,
|
|
262
|
-
});
|
|
263
|
-
//@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
|
|
264
|
-
event.waitUntil(event.respondWith(fetch(newRequest)));
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
if (event.request.method !== 'POST') {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
let currentDatabase = null;
|
|
271
|
-
const currentDatabases = getCurrentDatabasesTokenEndpoint(database, originalRequest.url);
|
|
272
|
-
const numberDatabase = currentDatabases.length;
|
|
273
|
-
if (numberDatabase > 0) {
|
|
274
|
-
const maPromesse = new Promise((resolve, reject) => {
|
|
275
|
-
const clonedRequest = originalRequest.clone();
|
|
276
|
-
const response = clonedRequest.text().then(actualBody => {
|
|
277
|
-
if (actualBody.includes(REFRESH_TOKEN) || actualBody.includes(ACCESS_TOKEN)) {
|
|
278
|
-
let newBody = actualBody;
|
|
279
|
-
for (let i = 0; i < numberDatabase; i++) {
|
|
280
|
-
const currentDb = currentDatabases[i];
|
|
281
|
-
if (currentDb && currentDb.tokens != null) {
|
|
282
|
-
const keyRefreshToken = REFRESH_TOKEN + '_' + currentDb.configurationName;
|
|
283
|
-
if (actualBody.includes(keyRefreshToken)) {
|
|
284
|
-
newBody = newBody.replace(keyRefreshToken, encodeURIComponent(currentDb.tokens.refresh_token));
|
|
285
|
-
currentDatabase = currentDb;
|
|
286
|
-
break;
|
|
287
|
-
}
|
|
288
|
-
const keyAccessToken = ACCESS_TOKEN + '_' + currentDb.configurationName;
|
|
289
|
-
if (actualBody.includes(keyAccessToken)) {
|
|
290
|
-
newBody = newBody.replace(keyAccessToken, encodeURIComponent(currentDb.tokens.access_token));
|
|
291
|
-
currentDatabase = currentDb;
|
|
292
|
-
break;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
const fetchPromise = fetch(originalRequest, {
|
|
297
|
-
body: newBody,
|
|
298
|
-
method: clonedRequest.method,
|
|
299
|
-
headers: {
|
|
300
|
-
...serializeHeaders(originalRequest.headers),
|
|
301
|
-
},
|
|
302
|
-
mode: clonedRequest.mode,
|
|
303
|
-
cache: clonedRequest.cache,
|
|
304
|
-
redirect: clonedRequest.redirect,
|
|
305
|
-
referrer: clonedRequest.referrer,
|
|
306
|
-
credentials: clonedRequest.credentials,
|
|
307
|
-
integrity: clonedRequest.integrity,
|
|
308
|
-
});
|
|
309
|
-
if (currentDatabase && currentDatabase.oidcServerConfiguration != null && currentDatabase.oidcServerConfiguration.revocationEndpoint && url.startsWith(currentDatabase.oidcServerConfiguration.revocationEndpoint)) {
|
|
310
|
-
return fetchPromise.then(async (response) => {
|
|
311
|
-
const text = await response.text();
|
|
312
|
-
return new Response(text, response);
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
return fetchPromise.then(hideTokens(currentDatabase)); //todo type assertion to OidcConfig but could be null, NEEDS REVIEW
|
|
316
|
-
}
|
|
317
|
-
else if (actualBody.includes('code_verifier=') && currentLoginCallbackConfigurationName) {
|
|
318
|
-
currentDatabase = database[currentLoginCallbackConfigurationName];
|
|
319
|
-
currentLoginCallbackConfigurationName = null;
|
|
320
|
-
let newBody = actualBody;
|
|
321
|
-
if (currentDatabase && currentDatabase.codeVerifier != null) {
|
|
322
|
-
const keyCodeVerifier = CODE_VERIFIER + '_' + currentDatabase.configurationName;
|
|
323
|
-
if (actualBody.includes(keyCodeVerifier)) {
|
|
324
|
-
newBody = newBody.replace(keyCodeVerifier, currentDatabase.codeVerifier);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return fetch(originalRequest, {
|
|
328
|
-
body: newBody,
|
|
329
|
-
method: clonedRequest.method,
|
|
330
|
-
headers: {
|
|
331
|
-
...serializeHeaders(originalRequest.headers),
|
|
332
|
-
},
|
|
333
|
-
mode: clonedRequest.mode,
|
|
334
|
-
cache: clonedRequest.cache,
|
|
335
|
-
redirect: clonedRequest.redirect,
|
|
336
|
-
referrer: clonedRequest.referrer,
|
|
337
|
-
credentials: clonedRequest.credentials,
|
|
338
|
-
integrity: clonedRequest.integrity,
|
|
339
|
-
}).then(hideTokens(currentDatabase));
|
|
340
|
-
}
|
|
341
|
-
});
|
|
342
|
-
response.then(r => {
|
|
343
|
-
if (r !== undefined) {
|
|
344
|
-
resolve(r);
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
console.log('success undefined');
|
|
348
|
-
reject(new Error('Response is undefined inside a success'));
|
|
349
|
-
}
|
|
350
|
-
}).catch(err => {
|
|
351
|
-
if (err !== undefined) {
|
|
352
|
-
reject(err);
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
console.log('error undefined');
|
|
356
|
-
reject(new Error('Response is undefined inside a error'));
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
//@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
|
|
361
|
-
event.waitUntil(event.respondWith(maPromesse));
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
const handleMessage = (event) => {
|
|
365
|
-
const port = event.ports[0];
|
|
366
|
-
const data = event.data;
|
|
367
|
-
const configurationName = data.configurationName;
|
|
368
|
-
let currentDatabase = database[configurationName];
|
|
369
|
-
if (!currentDatabase) {
|
|
370
|
-
database[configurationName] = {
|
|
371
|
-
tokens: null,
|
|
372
|
-
state: null,
|
|
373
|
-
codeVerifier: null,
|
|
374
|
-
oidcServerConfiguration: null,
|
|
375
|
-
oidcConfiguration: undefined,
|
|
376
|
-
nonce: null,
|
|
377
|
-
status: null,
|
|
378
|
-
configurationName,
|
|
379
|
-
};
|
|
380
|
-
currentDatabase = database[configurationName];
|
|
381
|
-
if (!trustedDomains[configurationName]) {
|
|
382
|
-
trustedDomains[configurationName] = [];
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
switch (data.type) {
|
|
386
|
-
case 'clear':
|
|
387
|
-
currentDatabase.tokens = null;
|
|
388
|
-
currentDatabase.state = null;
|
|
389
|
-
currentDatabase.codeVerifier = null;
|
|
390
|
-
currentDatabase.status = data.data.status;
|
|
391
|
-
port.postMessage({ configurationName });
|
|
392
|
-
return;
|
|
393
|
-
case 'init':
|
|
394
|
-
{
|
|
395
|
-
const oidcServerConfiguration = data.data.oidcServerConfiguration;
|
|
396
|
-
const domains = trustedDomains[configurationName];
|
|
397
|
-
if (!domains.find(f => f === acceptAnyDomainToken)) {
|
|
398
|
-
[oidcServerConfiguration.tokenEndpoint,
|
|
399
|
-
oidcServerConfiguration.revocationEndpoint,
|
|
400
|
-
oidcServerConfiguration.userInfoEndpoint,
|
|
401
|
-
oidcServerConfiguration.issuer].forEach(url => { checkDomain(domains, url); });
|
|
402
|
-
}
|
|
403
|
-
currentDatabase.oidcServerConfiguration = oidcServerConfiguration;
|
|
404
|
-
currentDatabase.oidcConfiguration = data.data.oidcConfiguration;
|
|
405
|
-
const where = data.data.where;
|
|
406
|
-
if (where === 'loginCallbackAsync' || where === 'tryKeepExistingSessionAsync') {
|
|
407
|
-
currentLoginCallbackConfigurationName = configurationName;
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
currentLoginCallbackConfigurationName = null;
|
|
411
|
-
}
|
|
412
|
-
if (!currentDatabase.tokens) {
|
|
413
|
-
port.postMessage({
|
|
414
|
-
tokens: null,
|
|
415
|
-
status: currentDatabase.status,
|
|
416
|
-
configurationName,
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
const tokens = {
|
|
421
|
-
...currentDatabase.tokens,
|
|
422
|
-
access_token: ACCESS_TOKEN + '_' + configurationName,
|
|
423
|
-
};
|
|
424
|
-
if (tokens.refresh_token) {
|
|
425
|
-
tokens.refresh_token = REFRESH_TOKEN + '_' + configurationName;
|
|
426
|
-
}
|
|
427
|
-
if (tokens.idTokenPayload && tokens.idTokenPayload.nonce && currentDatabase.nonce != null) {
|
|
428
|
-
tokens.idTokenPayload.nonce = NONCE_TOKEN + '_' + configurationName;
|
|
429
|
-
}
|
|
430
|
-
port.postMessage({
|
|
431
|
-
tokens,
|
|
432
|
-
status: currentDatabase.status,
|
|
433
|
-
configurationName,
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
438
|
-
case 'setState':
|
|
439
|
-
currentDatabase.state = data.data.state;
|
|
440
|
-
port.postMessage({ configurationName });
|
|
441
|
-
return;
|
|
442
|
-
case 'getState':
|
|
443
|
-
{
|
|
444
|
-
const state = currentDatabase.state;
|
|
445
|
-
port.postMessage({ configurationName, state });
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
case 'setCodeVerifier':
|
|
449
|
-
currentDatabase.codeVerifier = data.data.codeVerifier;
|
|
450
|
-
port.postMessage({ configurationName });
|
|
451
|
-
return;
|
|
452
|
-
case 'getCodeVerifier':
|
|
453
|
-
{
|
|
454
|
-
port.postMessage({ configurationName, codeVerifier: CODE_VERIFIER + '_' + configurationName });
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
case 'setSessionState':
|
|
458
|
-
currentDatabase.sessionState = data.data.sessionState;
|
|
459
|
-
port.postMessage({ configurationName });
|
|
460
|
-
return;
|
|
461
|
-
case 'getSessionState':
|
|
462
|
-
{
|
|
463
|
-
const sessionState = currentDatabase.sessionState;
|
|
464
|
-
port.postMessage({ configurationName, sessionState });
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
case 'setNonce':
|
|
468
|
-
currentDatabase.nonce = data.data.nonce;
|
|
469
|
-
port.postMessage({ configurationName });
|
|
470
|
-
return;
|
|
471
|
-
default:
|
|
472
|
-
currentDatabase.items = { ...data.data };
|
|
473
|
-
port.postMessage({ configurationName });
|
|
474
|
-
}
|
|
475
|
-
};
|
|
476
|
-
_self.addEventListener('install', handleInstall);
|
|
477
|
-
_self.addEventListener('activate', handleActivate);
|
|
478
|
-
_self.addEventListener('fetch', handleFetch);
|
|
479
|
-
_self.addEventListener('message', handleMessage);
|
|
480
|
-
const checkDomain = (domains, endpoint) => {
|
|
481
|
-
if (!endpoint) {
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
484
|
-
const domain = domains.find((domain) => {
|
|
485
|
-
let testable;
|
|
486
|
-
if (typeof domain === 'string') {
|
|
487
|
-
testable = new RegExp(`^${domain}`);
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
testable = domain;
|
|
491
|
-
}
|
|
492
|
-
return testable.test?.(endpoint);
|
|
493
|
-
});
|
|
494
|
-
if (!domain) {
|
|
495
|
-
throw new Error('Domain ' + endpoint + ' is not trusted, please add domain in ' + scriptFilename);
|
|
496
|
-
}
|
|
497
|
-
};
|
|
498
|
-
//# sourceMappingURL=OidcServiceWorker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OidcServiceWorker.js","sourceRoot":"","sources":["../service_worker/OidcServiceWorker.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|