@axa-fr/react-oidc 6.15.9 → 6.16.1
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/FetchToken.js +7 -12
- package/dist/FetchToken.js.map +1 -1
- package/dist/OidcProvider.js +43 -50
- package/dist/OidcProvider.js.map +1 -1
- package/dist/OidcSecure.js +9 -14
- package/dist/OidcSecure.js.map +1 -1
- package/dist/ReactOidc.js +29 -35
- package/dist/ReactOidc.js.map +1 -1
- package/dist/User.js +8 -12
- package/dist/User.js.map +1 -1
- package/dist/core/default-component/AuthenticateError.component.js +3 -5
- package/dist/core/default-component/AuthenticateError.component.js.map +1 -1
- package/dist/core/default-component/Authenticating.component.js +3 -5
- package/dist/core/default-component/Authenticating.component.js.map +1 -1
- package/dist/core/default-component/Callback.component.js +15 -22
- package/dist/core/default-component/Callback.component.js.map +1 -1
- package/dist/core/default-component/Loading.component.js +3 -5
- package/dist/core/default-component/Loading.component.js.map +1 -1
- package/dist/core/default-component/ServiceWorkerNotSupported.component.js +3 -5
- package/dist/core/default-component/ServiceWorkerNotSupported.component.js.map +1 -1
- package/dist/core/default-component/SessionLost.component.js +3 -7
- package/dist/core/default-component/SessionLost.component.js.map +1 -1
- package/dist/core/default-component/SilentCallback.component.js +7 -9
- package/dist/core/default-component/SilentCallback.component.js.map +1 -1
- package/dist/core/default-component/SilentLogin.component.js +9 -11
- package/dist/core/default-component/SilentLogin.component.js.map +1 -1
- package/dist/core/default-component/index.js +6 -19
- package/dist/core/default-component/index.js.map +1 -1
- package/dist/core/routes/OidcRoutes.js +18 -46
- package/dist/core/routes/OidcRoutes.js.map +1 -1
- package/dist/core/routes/withRouter.js +2 -7
- package/dist/core/routes/withRouter.js.map +1 -1
- package/dist/index.js +6 -20
- package/dist/index.js.map +1 -1
- 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/dist/vanilla/cache.js +2 -7
- package/dist/vanilla/cache.js.map +1 -1
- package/dist/vanilla/checkSession.js +5 -9
- package/dist/vanilla/checkSession.js.map +1 -1
- package/dist/vanilla/checkSessionIFrame.js +1 -5
- package/dist/vanilla/checkSessionIFrame.js.map +1 -1
- package/dist/vanilla/crypto.js +4 -33
- package/dist/vanilla/crypto.js.map +1 -1
- package/dist/vanilla/events.js +1 -4
- package/dist/vanilla/events.js.map +1 -1
- package/dist/vanilla/initSession.js +1 -5
- package/dist/vanilla/initSession.js.map +1 -1
- package/dist/vanilla/initWorker.js +11 -21
- package/dist/vanilla/initWorker.js.map +1 -1
- package/dist/vanilla/login.js +26 -31
- package/dist/vanilla/login.js.map +1 -1
- package/dist/vanilla/logout.js +11 -19
- package/dist/vanilla/logout.js.map +1 -1
- package/dist/vanilla/oidc.js +76 -107
- package/dist/vanilla/oidc.js.map +1 -1
- package/dist/vanilla/parseTokens.js +15 -24
- package/dist/vanilla/parseTokens.js.map +1 -1
- package/dist/vanilla/renewTokens.js +13 -21
- package/dist/vanilla/renewTokens.js.map +1 -1
- package/dist/vanilla/requests.js +18 -26
- package/dist/vanilla/requests.js.map +1 -1
- package/dist/vanilla/route-utils.js +5 -11
- package/dist/vanilla/route-utils.js.map +1 -1
- package/dist/vanilla/silentLogin.js +16 -24
- package/dist/vanilla/silentLogin.js.map +1 -1
- package/dist/vanilla/timer.js +1 -3
- package/dist/vanilla/timer.js.map +1 -1
- package/dist/vanilla/types.js +1 -2
- package/dist/vanilla/user.js +5 -9
- package/dist/vanilla/user.js.map +1 -1
- package/dist/vanilla/vanillaOidc.js +7 -11
- package/dist/vanilla/vanillaOidc.js.map +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
|