@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,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -8,11 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
8
|
});
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const parseTokens_1 = require("./parseTokens");
|
|
15
|
-
class VanillaOidc {
|
|
10
|
+
import { Oidc } from './oidc';
|
|
11
|
+
import { getValidTokenAsync } from './parseTokens';
|
|
12
|
+
export class VanillaOidc {
|
|
16
13
|
constructor(oidc) {
|
|
17
14
|
this._oidc = oidc;
|
|
18
15
|
}
|
|
@@ -26,10 +23,10 @@ class VanillaOidc {
|
|
|
26
23
|
this._oidc.publishEvent(eventName, data);
|
|
27
24
|
}
|
|
28
25
|
static getOrCreate(configuration, name = 'default') {
|
|
29
|
-
return new VanillaOidc(
|
|
26
|
+
return new VanillaOidc(Oidc.getOrCreate(configuration, name));
|
|
30
27
|
}
|
|
31
28
|
static get(name = 'default') {
|
|
32
|
-
return new VanillaOidc(
|
|
29
|
+
return new VanillaOidc(Oidc.get(name));
|
|
33
30
|
}
|
|
34
31
|
tryKeepExistingSessionAsync() {
|
|
35
32
|
return this._oidc.tryKeepExistingSessionAsync();
|
|
@@ -57,7 +54,7 @@ class VanillaOidc {
|
|
|
57
54
|
}
|
|
58
55
|
getValidTokenAsync(waitMs = 200, numberWait = 50) {
|
|
59
56
|
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
return
|
|
57
|
+
return getValidTokenAsync(this._oidc, waitMs, numberWait);
|
|
61
58
|
});
|
|
62
59
|
}
|
|
63
60
|
userInfoAsync() {
|
|
@@ -66,6 +63,5 @@ class VanillaOidc {
|
|
|
66
63
|
});
|
|
67
64
|
}
|
|
68
65
|
}
|
|
69
|
-
|
|
70
|
-
VanillaOidc.eventNames = oidc_1.Oidc.eventNames;
|
|
66
|
+
VanillaOidc.eventNames = Oidc.eventNames;
|
|
71
67
|
//# sourceMappingURL=vanillaOidc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vanillaOidc.js","sourceRoot":"","sources":["../../src/oidc/vanilla/vanillaOidc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vanillaOidc.js","sourceRoot":"","sources":["../../src/oidc/vanilla/vanillaOidc.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAiB,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AAOvE,MAAM,OAAO,WAAW;IAEpB,YAAY,IAAU;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,IAAoB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,uBAAuB,CAAC,EAAS;QAC7B,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,SAAgB,EAAE,IAAQ;QACnC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,aAA+B,EAAE,IAAI,GAAG,SAAS;QAChE,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS;QACvB,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAGD,2BAA2B;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,eAAsB,SAAS,EAAE,SAAmB,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,QAAe,SAAS,EAAE,eAAe,GAAG,KAAK;QAC1I,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAC/F,CAAC;IAED,WAAW,CAAC,oBAA+C,SAAS,EAAE,SAAoB,IAAI;QAC1F,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,wBAAwB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,SAAmB,IAAI;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IACpC,CAAC;IAEK,kBAAkB,CAAC,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE;;YAClD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC;KAAA;IAEK,aAAa;;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;KAAA;;AAvCM,sBAAU,GAAG,IAAI,CAAC,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axa-fr/react-oidc",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.16.1",
|
|
4
4
|
"private": false,
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"jsnext:main": "dist/index.js",
|
|
7
8
|
"types": "dist/index.d.ts",
|
|
@@ -15,6 +16,7 @@
|
|
|
15
16
|
"bin",
|
|
16
17
|
"src/oidc",
|
|
17
18
|
"src/override",
|
|
19
|
+
"service_worker",
|
|
18
20
|
"README.md",
|
|
19
21
|
"package.json",
|
|
20
22
|
"package-lock.json"
|
|
@@ -30,15 +32,17 @@
|
|
|
30
32
|
"next"
|
|
31
33
|
],
|
|
32
34
|
"scripts": {
|
|
33
|
-
"copy": "copyfiles -f ./dist
|
|
34
|
-
"
|
|
35
|
-
"
|
|
35
|
+
"copy:public": "copyfiles -f ./service_worker/dist/* ./public && copyfiles -f -soft ./dist/OidcTrustedDomains.js ./public",
|
|
36
|
+
"copy:dist": "copyfiles -f ./service_worker/dist/* ./dist/service_worker && copyfiles -f ./service_worker/dist/utils/* ./dist/service_worker/utils && copyfiles -f ./service_worker/oidcTrustedDomains.js ./dist",
|
|
37
|
+
"start": "npm run build:service-worker && npm run copy:public && cross-env PORT=4200 react-scripts start",
|
|
38
|
+
"build": "npm run build:service-worker && npm run copy:public && react-scripts build",
|
|
36
39
|
"test": "react-scripts test --coverage",
|
|
37
40
|
"eject": "react-scripts eject",
|
|
38
|
-
"clean": "rimraf dist",
|
|
39
|
-
"postinstall": "node ./bin/copy.
|
|
40
|
-
"
|
|
41
|
-
"
|
|
41
|
+
"clean": "rimraf dist && rimraf service_worker/dist",
|
|
42
|
+
"postinstall": "node ./bin/copy.cjs",
|
|
43
|
+
"test:service-worker": "vitest --root ./service_worker --coverage",
|
|
44
|
+
"build:service-worker": "tsc -p ./service_worker/tsconfig.json && vite build ./service_worker --config ./vite.serviceWorker.config.js",
|
|
45
|
+
"prepare": "npm run clean && tsc --build \"./tsconfig.json\" && npm run build && npm run copy:dist",
|
|
42
46
|
"lint": "eslint src"
|
|
43
47
|
},
|
|
44
48
|
"dependencies": {
|
|
@@ -55,6 +59,7 @@
|
|
|
55
59
|
"@types/react": "^18.0.21",
|
|
56
60
|
"@typescript-eslint/eslint-plugin": "^5.40.1",
|
|
57
61
|
"@typescript-eslint/parser": "^5.40.1",
|
|
62
|
+
"@vitest/coverage-c8": "^0.29.2",
|
|
58
63
|
"bootstrap": "4.6.1",
|
|
59
64
|
"copyfiles": "2.4.1",
|
|
60
65
|
"cross-env": "^7.0.3",
|
|
@@ -69,7 +74,10 @@
|
|
|
69
74
|
"react-dom": "^18.2.0",
|
|
70
75
|
"react-router-dom": "6.3.0",
|
|
71
76
|
"react-scripts": "5.0.1",
|
|
72
|
-
"typescript": "4.8.2"
|
|
77
|
+
"typescript": "4.8.2",
|
|
78
|
+
"vite": "^4.1.4",
|
|
79
|
+
"vite-plugin-dts": "^2.0.2",
|
|
80
|
+
"vitest": "^0.29.2"
|
|
73
81
|
},
|
|
74
82
|
"license": "MIT",
|
|
75
83
|
"publishConfig": {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: [__dirname + '/config/defaultEslintConfig'],
|
|
3
|
+
parserOptions: {
|
|
4
|
+
project: '../tsconfig.eslint.json',
|
|
5
|
+
tsconfigRootDir: __dirname,
|
|
6
|
+
},
|
|
7
|
+
rules: {
|
|
8
|
+
'@typescript-eslint/naming-convention': [
|
|
9
|
+
'error',
|
|
10
|
+
{
|
|
11
|
+
selector: 'variable',
|
|
12
|
+
types: ['boolean'],
|
|
13
|
+
format: ['PascalCase'],
|
|
14
|
+
prefix: ['is', 'with', 'should', 'has', 'can', 'did', 'will'],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { acceptAnyDomainToken, TOKEN, scriptFilename } from './constants';
|
|
2
|
+
import {
|
|
3
|
+
TrustedDomains,
|
|
4
|
+
Database,
|
|
5
|
+
OidcConfig,
|
|
6
|
+
OidcConfiguration,
|
|
7
|
+
MessageEventData,
|
|
8
|
+
} from './types';
|
|
9
|
+
import {
|
|
10
|
+
checkDomain,
|
|
11
|
+
getCurrentDatabaseDomain,
|
|
12
|
+
hideTokens,
|
|
13
|
+
isTokensValid,
|
|
14
|
+
serializeHeaders,
|
|
15
|
+
sleep,
|
|
16
|
+
} from './utils';
|
|
17
|
+
|
|
18
|
+
const _self = self as ServiceWorkerGlobalScope & typeof globalThis;
|
|
19
|
+
|
|
20
|
+
declare let trustedDomains: TrustedDomains;
|
|
21
|
+
|
|
22
|
+
_self.importScripts(scriptFilename);
|
|
23
|
+
|
|
24
|
+
const id = Math.round(new Date().getTime() / 1000).toString();
|
|
25
|
+
|
|
26
|
+
const keepAliveJsonFilename = 'OidcKeepAliveServiceWorker.json';
|
|
27
|
+
const handleInstall = (event: ExtendableEvent) => {
|
|
28
|
+
console.log('[OidcServiceWorker] service worker installed ' + id);
|
|
29
|
+
event.waitUntil(_self.skipWaiting());
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const handleActivate = (event: ExtendableEvent) => {
|
|
33
|
+
console.log('[OidcServiceWorker] service worker activated ' + id);
|
|
34
|
+
event.waitUntil(_self.clients.claim());
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
let currentLoginCallbackConfigurationName: string | null = null;
|
|
38
|
+
const database: Database = {
|
|
39
|
+
default: {
|
|
40
|
+
configurationName: 'default',
|
|
41
|
+
tokens: null,
|
|
42
|
+
status: null,
|
|
43
|
+
state: null,
|
|
44
|
+
codeVerifier: null,
|
|
45
|
+
nonce: null,
|
|
46
|
+
oidcServerConfiguration: null,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const getCurrentDatabasesTokenEndpoint = (database: Database, url: string) => {
|
|
51
|
+
const databases: OidcConfig[] = [];
|
|
52
|
+
for (const [, value] of Object.entries<OidcConfig>(database)) {
|
|
53
|
+
if (
|
|
54
|
+
value.oidcServerConfiguration != null &&
|
|
55
|
+
url.startsWith(value.oidcServerConfiguration.tokenEndpoint)
|
|
56
|
+
) {
|
|
57
|
+
databases.push(value);
|
|
58
|
+
} else if (
|
|
59
|
+
value.oidcServerConfiguration != null &&
|
|
60
|
+
value.oidcServerConfiguration.revocationEndpoint &&
|
|
61
|
+
url.startsWith(value.oidcServerConfiguration.revocationEndpoint)
|
|
62
|
+
) {
|
|
63
|
+
databases.push(value);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return databases;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const keepAliveAsync = async (event: FetchEvent) => {
|
|
70
|
+
const originalRequest = event.request;
|
|
71
|
+
const isFromVanilla = originalRequest.headers.has('oidc-vanilla');
|
|
72
|
+
const init = { status: 200, statusText: 'oidc-service-worker' };
|
|
73
|
+
const response = new Response('{}', init);
|
|
74
|
+
if (!isFromVanilla) {
|
|
75
|
+
for (let i = 0; i < 240; i++) {
|
|
76
|
+
await sleep(1000 + Math.floor(Math.random() * 1000));
|
|
77
|
+
const cache = await caches.open('oidc_dummy_cache');
|
|
78
|
+
await cache.put(event.request, response.clone());
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return response;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const handleFetch = async (event: FetchEvent) => {
|
|
86
|
+
const originalRequest = event.request;
|
|
87
|
+
const url = originalRequest.url;
|
|
88
|
+
if (originalRequest.url.includes(keepAliveJsonFilename)) {
|
|
89
|
+
event.respondWith(keepAliveAsync(event));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const currentDatabaseForRequestAccessToken = getCurrentDatabaseDomain(
|
|
94
|
+
database,
|
|
95
|
+
originalRequest.url,
|
|
96
|
+
trustedDomains
|
|
97
|
+
);
|
|
98
|
+
if (
|
|
99
|
+
currentDatabaseForRequestAccessToken &&
|
|
100
|
+
currentDatabaseForRequestAccessToken.tokens &&
|
|
101
|
+
currentDatabaseForRequestAccessToken.tokens.access_token
|
|
102
|
+
) {
|
|
103
|
+
while (
|
|
104
|
+
currentDatabaseForRequestAccessToken.tokens &&
|
|
105
|
+
!isTokensValid(currentDatabaseForRequestAccessToken.tokens)
|
|
106
|
+
) {
|
|
107
|
+
await sleep(200);
|
|
108
|
+
}
|
|
109
|
+
const newRequest = new Request(originalRequest, {
|
|
110
|
+
headers: {
|
|
111
|
+
...serializeHeaders(originalRequest.headers),
|
|
112
|
+
authorization:
|
|
113
|
+
'Bearer ' + currentDatabaseForRequestAccessToken.tokens.access_token,
|
|
114
|
+
},
|
|
115
|
+
mode: (
|
|
116
|
+
currentDatabaseForRequestAccessToken.oidcConfiguration as OidcConfiguration
|
|
117
|
+
).service_worker_convert_all_requests_to_cors
|
|
118
|
+
? 'cors'
|
|
119
|
+
: originalRequest.mode,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
//@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
|
|
123
|
+
event.waitUntil(event.respondWith(fetch(newRequest)));
|
|
124
|
+
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (event.request.method !== 'POST') {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
let currentDatabase: OidcConfig | null = null;
|
|
133
|
+
const currentDatabases = getCurrentDatabasesTokenEndpoint(
|
|
134
|
+
database,
|
|
135
|
+
originalRequest.url
|
|
136
|
+
);
|
|
137
|
+
const numberDatabase = currentDatabases.length;
|
|
138
|
+
if (numberDatabase > 0) {
|
|
139
|
+
const maPromesse = new Promise<Response>((resolve, reject) => {
|
|
140
|
+
const clonedRequest = originalRequest.clone();
|
|
141
|
+
const response = clonedRequest.text().then((actualBody) => {
|
|
142
|
+
if (
|
|
143
|
+
actualBody.includes(TOKEN.REFRESH_TOKEN) ||
|
|
144
|
+
actualBody.includes(TOKEN.ACCESS_TOKEN)
|
|
145
|
+
) {
|
|
146
|
+
let newBody = actualBody;
|
|
147
|
+
for (let i = 0; i < numberDatabase; i++) {
|
|
148
|
+
const currentDb = currentDatabases[i];
|
|
149
|
+
|
|
150
|
+
if (currentDb && currentDb.tokens != null) {
|
|
151
|
+
const keyRefreshToken =
|
|
152
|
+
TOKEN.REFRESH_TOKEN + '_' + currentDb.configurationName;
|
|
153
|
+
if (actualBody.includes(keyRefreshToken)) {
|
|
154
|
+
newBody = newBody.replace(
|
|
155
|
+
keyRefreshToken,
|
|
156
|
+
encodeURIComponent(currentDb.tokens.refresh_token as string)
|
|
157
|
+
);
|
|
158
|
+
currentDatabase = currentDb;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
const keyAccessToken =
|
|
162
|
+
TOKEN.ACCESS_TOKEN + '_' + currentDb.configurationName;
|
|
163
|
+
if (actualBody.includes(keyAccessToken)) {
|
|
164
|
+
newBody = newBody.replace(
|
|
165
|
+
keyAccessToken,
|
|
166
|
+
encodeURIComponent(currentDb.tokens.access_token)
|
|
167
|
+
);
|
|
168
|
+
currentDatabase = currentDb;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const fetchPromise = fetch(originalRequest, {
|
|
174
|
+
body: newBody,
|
|
175
|
+
method: clonedRequest.method,
|
|
176
|
+
headers: {
|
|
177
|
+
...serializeHeaders(originalRequest.headers),
|
|
178
|
+
},
|
|
179
|
+
mode: clonedRequest.mode,
|
|
180
|
+
cache: clonedRequest.cache,
|
|
181
|
+
redirect: clonedRequest.redirect,
|
|
182
|
+
referrer: clonedRequest.referrer,
|
|
183
|
+
credentials: clonedRequest.credentials,
|
|
184
|
+
integrity: clonedRequest.integrity,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
if (
|
|
188
|
+
currentDatabase &&
|
|
189
|
+
currentDatabase.oidcServerConfiguration != null &&
|
|
190
|
+
currentDatabase.oidcServerConfiguration.revocationEndpoint &&
|
|
191
|
+
url.startsWith(
|
|
192
|
+
currentDatabase.oidcServerConfiguration.revocationEndpoint
|
|
193
|
+
)
|
|
194
|
+
) {
|
|
195
|
+
return fetchPromise.then(async (response) => {
|
|
196
|
+
const text = await response.text();
|
|
197
|
+
return new Response(text, response);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return fetchPromise.then(hideTokens(currentDatabase as OidcConfig)); //todo type assertion to OidcConfig but could be null, NEEDS REVIEW
|
|
201
|
+
} else if (
|
|
202
|
+
actualBody.includes('code_verifier=') &&
|
|
203
|
+
currentLoginCallbackConfigurationName
|
|
204
|
+
) {
|
|
205
|
+
currentDatabase = database[currentLoginCallbackConfigurationName];
|
|
206
|
+
currentLoginCallbackConfigurationName = null;
|
|
207
|
+
let newBody = actualBody;
|
|
208
|
+
if (currentDatabase && currentDatabase.codeVerifier != null) {
|
|
209
|
+
const keyCodeVerifier =
|
|
210
|
+
TOKEN.CODE_VERIFIER + '_' + currentDatabase.configurationName;
|
|
211
|
+
if (actualBody.includes(keyCodeVerifier)) {
|
|
212
|
+
newBody = newBody.replace(
|
|
213
|
+
keyCodeVerifier,
|
|
214
|
+
currentDatabase.codeVerifier
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return fetch(originalRequest, {
|
|
220
|
+
body: newBody,
|
|
221
|
+
method: clonedRequest.method,
|
|
222
|
+
headers: {
|
|
223
|
+
...serializeHeaders(originalRequest.headers),
|
|
224
|
+
},
|
|
225
|
+
mode: clonedRequest.mode,
|
|
226
|
+
cache: clonedRequest.cache,
|
|
227
|
+
redirect: clonedRequest.redirect,
|
|
228
|
+
referrer: clonedRequest.referrer,
|
|
229
|
+
credentials: clonedRequest.credentials,
|
|
230
|
+
integrity: clonedRequest.integrity,
|
|
231
|
+
}).then(hideTokens(currentDatabase));
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
});
|
|
235
|
+
response
|
|
236
|
+
.then((r) => {
|
|
237
|
+
if (r !== undefined) {
|
|
238
|
+
resolve(r);
|
|
239
|
+
} else {
|
|
240
|
+
console.log('success undefined');
|
|
241
|
+
reject(new Error('Response is undefined inside a success'));
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
.catch((err) => {
|
|
245
|
+
if (err !== undefined) {
|
|
246
|
+
reject(err);
|
|
247
|
+
} else {
|
|
248
|
+
console.log('error undefined');
|
|
249
|
+
reject(new Error('Response is undefined inside a error'));
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
//@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
|
|
255
|
+
event.waitUntil(event.respondWith(maPromesse));
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const handleMessage = (event: ExtendableMessageEvent) => {
|
|
260
|
+
const port = event.ports[0];
|
|
261
|
+
const data = event.data as MessageEventData;
|
|
262
|
+
const configurationName = data.configurationName;
|
|
263
|
+
let currentDatabase = database[configurationName];
|
|
264
|
+
|
|
265
|
+
if (!currentDatabase) {
|
|
266
|
+
database[configurationName] = {
|
|
267
|
+
tokens: null,
|
|
268
|
+
state: null,
|
|
269
|
+
codeVerifier: null,
|
|
270
|
+
oidcServerConfiguration: null,
|
|
271
|
+
oidcConfiguration: undefined,
|
|
272
|
+
nonce: null,
|
|
273
|
+
status: null,
|
|
274
|
+
configurationName,
|
|
275
|
+
};
|
|
276
|
+
currentDatabase = database[configurationName];
|
|
277
|
+
if (!trustedDomains[configurationName]) {
|
|
278
|
+
trustedDomains[configurationName] = [];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
switch (data.type) {
|
|
283
|
+
case 'clear':
|
|
284
|
+
currentDatabase.tokens = null;
|
|
285
|
+
currentDatabase.state = null;
|
|
286
|
+
currentDatabase.codeVerifier = null;
|
|
287
|
+
currentDatabase.status = data.data.status;
|
|
288
|
+
port.postMessage({ configurationName });
|
|
289
|
+
return;
|
|
290
|
+
case 'init': {
|
|
291
|
+
const oidcServerConfiguration = data.data.oidcServerConfiguration;
|
|
292
|
+
const domains = trustedDomains[configurationName];
|
|
293
|
+
if (!domains.find((f) => f === acceptAnyDomainToken)) {
|
|
294
|
+
[
|
|
295
|
+
oidcServerConfiguration.tokenEndpoint,
|
|
296
|
+
oidcServerConfiguration.revocationEndpoint,
|
|
297
|
+
oidcServerConfiguration.userInfoEndpoint,
|
|
298
|
+
oidcServerConfiguration.issuer,
|
|
299
|
+
].forEach((url) => {
|
|
300
|
+
checkDomain(domains, url);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
currentDatabase.oidcServerConfiguration = oidcServerConfiguration;
|
|
304
|
+
currentDatabase.oidcConfiguration = data.data.oidcConfiguration;
|
|
305
|
+
const where = data.data.where;
|
|
306
|
+
if (
|
|
307
|
+
where === 'loginCallbackAsync' ||
|
|
308
|
+
where === 'tryKeepExistingSessionAsync'
|
|
309
|
+
) {
|
|
310
|
+
currentLoginCallbackConfigurationName = configurationName;
|
|
311
|
+
} else {
|
|
312
|
+
currentLoginCallbackConfigurationName = null;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (!currentDatabase.tokens) {
|
|
316
|
+
port.postMessage({
|
|
317
|
+
tokens: null,
|
|
318
|
+
status: currentDatabase.status,
|
|
319
|
+
configurationName,
|
|
320
|
+
});
|
|
321
|
+
} else {
|
|
322
|
+
const tokens = {
|
|
323
|
+
...currentDatabase.tokens,
|
|
324
|
+
access_token: TOKEN.ACCESS_TOKEN + '_' + configurationName,
|
|
325
|
+
};
|
|
326
|
+
if (tokens.refresh_token) {
|
|
327
|
+
tokens.refresh_token = TOKEN.REFRESH_TOKEN + '_' + configurationName;
|
|
328
|
+
}
|
|
329
|
+
if (
|
|
330
|
+
tokens.idTokenPayload &&
|
|
331
|
+
tokens.idTokenPayload.nonce &&
|
|
332
|
+
currentDatabase.nonce != null
|
|
333
|
+
) {
|
|
334
|
+
tokens.idTokenPayload.nonce =
|
|
335
|
+
TOKEN.NONCE_TOKEN + '_' + configurationName;
|
|
336
|
+
}
|
|
337
|
+
port.postMessage({
|
|
338
|
+
tokens,
|
|
339
|
+
status: currentDatabase.status,
|
|
340
|
+
configurationName,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
case 'setState':
|
|
346
|
+
currentDatabase.state = data.data.state;
|
|
347
|
+
port.postMessage({ configurationName });
|
|
348
|
+
return;
|
|
349
|
+
case 'getState': {
|
|
350
|
+
const state = currentDatabase.state;
|
|
351
|
+
port.postMessage({ configurationName, state });
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
case 'setCodeVerifier':
|
|
355
|
+
currentDatabase.codeVerifier = data.data.codeVerifier;
|
|
356
|
+
port.postMessage({ configurationName });
|
|
357
|
+
return;
|
|
358
|
+
case 'getCodeVerifier': {
|
|
359
|
+
port.postMessage({
|
|
360
|
+
configurationName,
|
|
361
|
+
codeVerifier: TOKEN.CODE_VERIFIER + '_' + configurationName,
|
|
362
|
+
});
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
case 'setSessionState':
|
|
366
|
+
currentDatabase.sessionState = data.data.sessionState;
|
|
367
|
+
port.postMessage({ configurationName });
|
|
368
|
+
return;
|
|
369
|
+
case 'getSessionState': {
|
|
370
|
+
const sessionState = currentDatabase.sessionState;
|
|
371
|
+
port.postMessage({ configurationName, sessionState });
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
case 'setNonce':
|
|
375
|
+
currentDatabase.nonce = data.data.nonce;
|
|
376
|
+
port.postMessage({ configurationName });
|
|
377
|
+
return;
|
|
378
|
+
default:
|
|
379
|
+
currentDatabase.items = { ...data.data };
|
|
380
|
+
port.postMessage({ configurationName });
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
_self.addEventListener('install', handleInstall);
|
|
385
|
+
_self.addEventListener('activate', handleActivate);
|
|
386
|
+
_self.addEventListener('fetch', handleFetch);
|
|
387
|
+
_self.addEventListener('message', handleMessage);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const scriptFilename = 'OidcTrustedDomains.js'; /* global trustedDomains */
|
|
2
|
+
const acceptAnyDomainToken = '*';
|
|
3
|
+
|
|
4
|
+
type TokenType = {
|
|
5
|
+
readonly REFRESH_TOKEN: string;
|
|
6
|
+
readonly ACCESS_TOKEN: string;
|
|
7
|
+
readonly NONCE_TOKEN: string;
|
|
8
|
+
readonly CODE_VERIFIER: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const TOKEN: TokenType = {
|
|
12
|
+
REFRESH_TOKEN: 'REFRESH_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER',
|
|
13
|
+
ACCESS_TOKEN: 'ACCESS_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER',
|
|
14
|
+
NONCE_TOKEN: 'NONCE_SECURED_BY_OIDC_SERVICE_WORKER',
|
|
15
|
+
CODE_VERIFIER: 'CODE_VERIFIER_SECURED_BY_OIDC_SERVICE_WORKER',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type TokenRenewModeType = {
|
|
19
|
+
readonly access_token_or_id_token_invalid: string;
|
|
20
|
+
readonly access_token_invalid: string;
|
|
21
|
+
readonly id_token_invalid: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const TokenRenewMode: TokenRenewModeType = {
|
|
25
|
+
access_token_or_id_token_invalid: 'access_token_or_id_token_invalid',
|
|
26
|
+
access_token_invalid: 'access_token_invalid',
|
|
27
|
+
id_token_invalid: 'id_token_invalid',
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const openidWellknownUrlEndWith = '/.well-known/openid-configuration';
|
|
31
|
+
|
|
32
|
+
export { scriptFilename, acceptAnyDomainToken, TOKEN, TokenRenewMode, openidWellknownUrlEndWith };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OidcServiceWorker.d.ts","sourceRoot":"","sources":["../OidcServiceWorker.ts"],"names":[],"mappings":""}
|