@oslokommune/auth-bff 1.6.1 → 2.0.0-beta1
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/dist/package.json +57 -0
- package/dist/src/OpenIdConfigManager.d.ts +10 -0
- package/dist/src/OpenIdConfigManager.d.ts.map +1 -0
- package/dist/src/OpenIdConfigManager.js +77 -0
- package/dist/src/config.d.ts +25 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +55 -0
- package/dist/src/middleware/OidcMiddleware.d.ts +20 -0
- package/dist/src/middleware/OidcMiddleware.d.ts.map +1 -0
- package/dist/src/middleware/OidcMiddleware.js +231 -0
- package/dist/src/middleware/oidc-routes.d.mts.map +1 -0
- package/dist/src/middleware/proxy-routes.d.mts.map +1 -0
- package/dist/{middleware → src/middleware}/proxy-routes.mjs +5 -5
- package/dist/src/middleware/security-headers.d.mts.map +1 -0
- package/dist/{middleware → src/middleware}/security-headers.mjs +2 -2
- package/dist/src/middleware/sessions/dynamoDbSessionStore.d.mts +3 -0
- package/dist/src/middleware/sessions/dynamoDbSessionStore.d.mts.map +1 -0
- package/dist/{middleware → src/middleware}/sessions/dynamoDbSessionStore.mjs +12 -17
- package/dist/src/middleware/sessions/memorySessionStore.d.mts +3 -0
- package/dist/src/middleware/sessions/memorySessionStore.d.mts.map +1 -0
- package/dist/src/middleware/sessions/sessions.d.mts +2 -0
- package/dist/src/middleware/sessions/sessions.d.mts.map +1 -0
- package/dist/{middleware → src/middleware}/sessions/sessions.mjs +3 -4
- package/dist/src/middleware/static-routes.d.mts.map +1 -0
- package/dist/src/react/AuthContext.d.ts.map +1 -0
- package/dist/src/react/AuthContextProvider.d.ts.map +1 -0
- package/dist/{react → src/react}/AuthContextProvider.jsx +15 -27
- package/dist/src/react/UseAuthContext.d.ts +2 -0
- package/dist/src/react/UseAuthContext.d.ts.map +1 -0
- package/dist/{react → src/react}/UseAuthContext.jsx +2 -2
- package/dist/src/react/global-user.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +5 -0
- package/dist/src/react/index.d.ts.map +1 -0
- package/dist/src/react/index.js +4 -0
- package/dist/src/react/poller.d.ts.map +1 -0
- package/dist/src/react/poller.js +28 -0
- package/dist/{server.d.mts.map → src/server.d.mts.map} +1 -1
- package/dist/{server.mjs → src/server.mjs} +2 -2
- package/dist/{utils.d.ts.map → src/utils.d.ts.map} +1 -1
- package/dist/src/utils.js +3 -0
- package/dist/src/vite-plugin.d.mts.map +1 -0
- package/dist/src/vite-plugin.mjs +35 -0
- package/package.json +16 -9
- package/dist/client.d.mts +0 -7
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs +0 -92
- package/dist/config.d.mts +0 -4
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs +0 -69
- package/dist/middleware/oidc-routes.d.mts.map +0 -1
- package/dist/middleware/oidc.d.mts +0 -17
- package/dist/middleware/oidc.d.mts.map +0 -1
- package/dist/middleware/oidc.mjs +0 -220
- package/dist/middleware/proxy-routes.d.mts.map +0 -1
- package/dist/middleware/security-headers.d.mts.map +0 -1
- package/dist/middleware/sessions/dynamoDbSessionStore.d.mts +0 -2
- package/dist/middleware/sessions/dynamoDbSessionStore.d.mts.map +0 -1
- package/dist/middleware/sessions/memorySessionStore.d.mts +0 -2
- package/dist/middleware/sessions/memorySessionStore.d.mts.map +0 -1
- package/dist/middleware/sessions/sessions.d.mts +0 -2
- package/dist/middleware/sessions/sessions.d.mts.map +0 -1
- package/dist/middleware/static-routes.d.mts.map +0 -1
- package/dist/react/AuthContext.d.ts.map +0 -1
- package/dist/react/AuthContextProvider.d.ts.map +0 -1
- package/dist/react/UseAuthContext.d.ts +0 -2
- package/dist/react/UseAuthContext.d.ts.map +0 -1
- package/dist/react/global-user.d.ts.map +0 -1
- package/dist/react/index.d.ts +0 -5
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js +0 -4
- package/dist/react/poller.d.ts.map +0 -1
- package/dist/react/poller.js +0 -39
- package/dist/utils.js +0 -3
- package/dist/vite-plugin.d.mts.map +0 -1
- package/dist/vite-plugin.mjs +0 -44
- /package/dist/{middleware → src/middleware}/oidc-routes.d.mts +0 -0
- /package/dist/{middleware → src/middleware}/oidc-routes.mjs +0 -0
- /package/dist/{middleware → src/middleware}/proxy-routes.d.mts +0 -0
- /package/dist/{middleware → src/middleware}/security-headers.d.mts +0 -0
- /package/dist/{middleware → src/middleware}/sessions/memorySessionStore.mjs +0 -0
- /package/dist/{middleware → src/middleware}/static-routes.d.mts +0 -0
- /package/dist/{middleware → src/middleware}/static-routes.mjs +0 -0
- /package/dist/{react → src/react}/AuthContext.d.ts +0 -0
- /package/dist/{react → src/react}/AuthContext.jsx +0 -0
- /package/dist/{react → src/react}/AuthContextProvider.d.ts +0 -0
- /package/dist/{react → src/react}/global-user.d.ts +0 -0
- /package/dist/{react → src/react}/global-user.js +0 -0
- /package/dist/{react → src/react}/poller.d.ts +0 -0
- /package/dist/{server.d.mts → src/server.d.mts} +0 -0
- /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
- /package/dist/{vite-plugin.d.mts → src/vite-plugin.d.mts} +0 -0
|
@@ -2,14 +2,13 @@ import session from "express-session";
|
|
|
2
2
|
import { dynamoDbSessionStore } from "./dynamoDbSessionStore.mjs";
|
|
3
3
|
import { memorySessionStore } from "./memorySessionStore.mjs";
|
|
4
4
|
export function sessions(config) {
|
|
5
|
-
var _a, _b;
|
|
6
5
|
let sessionStore;
|
|
7
6
|
if (config.sessionStoreType === 'memory') {
|
|
8
|
-
const sessionStoreOptions =
|
|
7
|
+
const sessionStoreOptions = config.sessionStoreOptions ?? {};
|
|
9
8
|
sessionStore = memorySessionStore(sessionStoreOptions);
|
|
10
9
|
}
|
|
11
10
|
else if (config.sessionStoreType === 'dynamodb') {
|
|
12
|
-
const sessionStoreOptions =
|
|
11
|
+
const sessionStoreOptions = config.sessionStoreOptions ?? {};
|
|
13
12
|
sessionStore = dynamoDbSessionStore(sessionStoreOptions);
|
|
14
13
|
}
|
|
15
14
|
else if (config.sessionStoreType) {
|
|
@@ -33,7 +32,7 @@ export function sessions(config) {
|
|
|
33
32
|
}),
|
|
34
33
|
(req, _, next) => {
|
|
35
34
|
// make this function available to request handlers
|
|
36
|
-
req.destroySessionByIdpSid = sessionStore
|
|
35
|
+
req.destroySessionByIdpSid = sessionStore?.destroyByIdpSid;
|
|
37
36
|
next();
|
|
38
37
|
}
|
|
39
38
|
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-routes.d.mts","sourceRoot":"","sources":["../../../src/middleware/static-routes.mjs"],"names":[],"mappings":"AAIA,+CAiBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../src/react/AuthContext.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7E,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,WAAW,2CAAyD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthContextProvider.d.ts","sourceRoot":"","sources":["../../../src/react/AuthContextProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAA8B,MAAM,OAAO,CAAC;AAK7D,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,SAAS,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,EAAE,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EACE,QAAQ,EACR,YAAoB,EACpB,eAAsB,EACtB,OAAY,EACZ,YAAY,EACb,EAAE,wBAAwB,+BA+F9D"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { useEffect, useRef, useState } from "react";
|
|
11
|
-
import { AuthContext } from "./AuthContext";
|
|
12
|
-
import { setCurrentUser } from "./global-user";
|
|
13
|
-
import * as poller from './poller';
|
|
2
|
+
import { AuthContext } from "./AuthContext.jsx";
|
|
3
|
+
import { setCurrentUser } from "./global-user.js";
|
|
4
|
+
import * as poller from './poller.js';
|
|
14
5
|
export function AuthContextProvider({ children, authRequired = false, loaderComponent = null, baseUrl = '', pollInterval }) {
|
|
15
6
|
const [user, setUser] = useState(undefined);
|
|
16
7
|
const [state, setState] = useState('pending');
|
|
@@ -22,19 +13,17 @@ export function AuthContextProvider({ children, authRequired = false, loaderComp
|
|
|
22
13
|
const currentRelativeLocation = window.location.pathname + window.location.search + window.location.hash;
|
|
23
14
|
window.location.assign(`${baseUrl}/auth/login?redirectUrl=${encodeURIComponent(currentRelativeLocation)}`);
|
|
24
15
|
}
|
|
25
|
-
function getUser() {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
});
|
|
16
|
+
async function getUser() {
|
|
17
|
+
const res = await fetch(`${baseUrl}/auth/user`);
|
|
18
|
+
if (res.ok) {
|
|
19
|
+
return await res.json();
|
|
20
|
+
}
|
|
21
|
+
else if (res.status === 401) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw Error(`Failed to get user: ${res.status} ${res.statusText}`);
|
|
26
|
+
}
|
|
38
27
|
}
|
|
39
28
|
function startPoller() {
|
|
40
29
|
const setExpiredIfNoUser = (user) => {
|
|
@@ -65,8 +54,7 @@ export function AuthContextProvider({ children, authRequired = false, loaderComp
|
|
|
65
54
|
}
|
|
66
55
|
}, [pollInterval, state]);
|
|
67
56
|
useEffect(() => {
|
|
68
|
-
|
|
69
|
-
(_a = userPromise.current) !== null && _a !== void 0 ? _a : (userPromise.current = getUser().then(user => {
|
|
57
|
+
userPromise.current ?? (userPromise.current = getUser().then(user => {
|
|
70
58
|
if (user) {
|
|
71
59
|
setUser(user);
|
|
72
60
|
setCurrentUser(user);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UseAuthContext.d.ts","sourceRoot":"","sources":["../../../src/react/UseAuthContext.tsx"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,QAAQ,GAAE,OAAe,gDAOvD"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useContext } from "react";
|
|
2
|
-
import { AuthContext } from "./AuthContext";
|
|
2
|
+
import { AuthContext } from "./AuthContext.jsx";
|
|
3
3
|
export function useAuthContext(required = false) {
|
|
4
4
|
const authContext = useContext(AuthContext);
|
|
5
|
-
if (required &&
|
|
5
|
+
if (required && authContext?.state === 'unauthenticated') {
|
|
6
6
|
window.location.assign('/auth/login');
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-user.d.ts","sourceRoot":"","sources":["../../../src/react/global-user.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,WAE7B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,QAE1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../../src/react/poller.ts"],"names":[],"mappings":"AAoBA,wBAAgB,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,cAAc,EAAE,MAAM,QAK3G;AAED,wBAAgB,IAAI,SAEnB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
let timer;
|
|
2
|
+
let lastChecked = Date.now();
|
|
3
|
+
let callback;
|
|
4
|
+
let poller;
|
|
5
|
+
let minInterval;
|
|
6
|
+
async function doPoll() {
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
const diff = now - lastChecked;
|
|
9
|
+
clearInterval(timer);
|
|
10
|
+
if (diff > minInterval) {
|
|
11
|
+
const res = await poller();
|
|
12
|
+
callback(res);
|
|
13
|
+
lastChecked = now;
|
|
14
|
+
timer = setInterval(doPoll, minInterval);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
timer = setInterval(doPoll, minInterval - diff);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function start(newChecker, newCallback, newMinInterval) {
|
|
21
|
+
poller = newChecker;
|
|
22
|
+
callback = newCallback;
|
|
23
|
+
minInterval = newMinInterval;
|
|
24
|
+
doPoll();
|
|
25
|
+
}
|
|
26
|
+
export function stop() {
|
|
27
|
+
clearInterval(timer);
|
|
28
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["../../src/server.mjs"],"names":[],"mappings":""}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import express from "express";
|
|
3
3
|
import compression from "compression";
|
|
4
|
-
import { loadConfig } from './config.
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
5
|
import { proxyRoutes } from "./middleware/proxy-routes.mjs";
|
|
6
6
|
import { staticRoutes } from "./middleware/static-routes.mjs";
|
|
7
7
|
import { securityHeaders } from "./middleware/security-headers.mjs";
|
|
8
8
|
import { sessions } from "./middleware/sessions/sessions.mjs";
|
|
9
9
|
import { oidcRoutes } from "./middleware/oidc-routes.mjs";
|
|
10
|
-
import { OidcMiddleware } from "./middleware/
|
|
10
|
+
import { OidcMiddleware } from "./middleware/OidcMiddleware.js";
|
|
11
11
|
import commandLineArgs from "command-line-args";
|
|
12
12
|
import packageJson from "../package.json" with { type: 'json' };
|
|
13
13
|
const options = commandLineArgs({ name: 'configFile' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.js"],"names":[],"mappings":"AAAA,6DAEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.mts","sourceRoot":"","sources":["../../src/vite-plugin.mjs"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,kDAPa;IACT,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,CAAC,CAAC,CAAS,IAAgB,EAAhB;QAAC,WAAW,EAAE,GAAC,CAAA;KAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAC,GAAC,CAAC,CAAC;IACjE,sBAAsB,EAAE,CAAC,CAAC,CAAS,IAAgB,EAAhB;QAAC,WAAW,EAAE,GAAC,CAAA;KAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAC,GAAC,CAAC,CAAA;CACvE,CASH"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { OidcMiddleware } from "./middleware/OidcMiddleware.js";
|
|
4
|
+
function configureServer(configFile) {
|
|
5
|
+
return async ({ middlewares }) => {
|
|
6
|
+
const { oidcRoutes } = await import("./middleware/oidc-routes.mjs");
|
|
7
|
+
const { proxyRoutes } = await import("./middleware/proxy-routes.mjs");
|
|
8
|
+
const { sessions } = await import("./middleware/sessions/sessions.mjs");
|
|
9
|
+
const config = await loadConfig(configFile);
|
|
10
|
+
const oidcMiddleware = await OidcMiddleware.create(config);
|
|
11
|
+
const basePath = config.basePath || "/";
|
|
12
|
+
const app = express();
|
|
13
|
+
app.use(sessions(config));
|
|
14
|
+
app.use(basePath, oidcRoutes(oidcMiddleware));
|
|
15
|
+
app.use(basePath, proxyRoutes(config, oidcMiddleware));
|
|
16
|
+
middlewares.use(app);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @returns {{
|
|
22
|
+
* name: 'bff',
|
|
23
|
+
* apply: 'serve',
|
|
24
|
+
* configureServer: ((function({middlewares: *}): Promise<void>)|*),
|
|
25
|
+
* configurePreviewServer: ((function({middlewares: *}): Promise<void>)|*)
|
|
26
|
+
* }}
|
|
27
|
+
*/
|
|
28
|
+
export default function bff({ configFile } = {}) {
|
|
29
|
+
return {
|
|
30
|
+
name: 'bff',
|
|
31
|
+
apply: 'serve',
|
|
32
|
+
configureServer: configureServer(configFile),
|
|
33
|
+
configurePreviewServer: configureServer(configFile)
|
|
34
|
+
};
|
|
35
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oslokommune/auth-bff",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta1",
|
|
4
4
|
"repository": "https://github.com/oslokommune/auth-bff.git",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -9,14 +9,15 @@
|
|
|
9
9
|
"build": "tsc",
|
|
10
10
|
"run": "node ./dist/server.mjs",
|
|
11
11
|
"build-and-publish": "tsc && npm publish",
|
|
12
|
-
"build-and-publish-prerelease": "tsc && npm publish --tag prerelease"
|
|
12
|
+
"build-and-publish-prerelease": "tsc && npm publish --tag prerelease",
|
|
13
|
+
"test": "vitest"
|
|
13
14
|
},
|
|
14
15
|
"exports": {
|
|
15
|
-
"./vite-plugin": "./dist/vite-plugin.mjs",
|
|
16
|
-
"./react": "./dist/react/index.js"
|
|
16
|
+
"./vite-plugin": "./dist/src/vite-plugin.mjs",
|
|
17
|
+
"./react": "./dist/src/react/index.js"
|
|
17
18
|
},
|
|
18
19
|
"bin": {
|
|
19
|
-
"auth-bff": "dist/server.mjs"
|
|
20
|
+
"auth-bff": "dist/src/server.mjs"
|
|
20
21
|
},
|
|
21
22
|
"files": [
|
|
22
23
|
"/dist"
|
|
@@ -26,10 +27,16 @@
|
|
|
26
27
|
"license": "",
|
|
27
28
|
"description": "",
|
|
28
29
|
"devDependencies": {
|
|
29
|
-
"@types/
|
|
30
|
+
"@types/compression": "^1.8.1",
|
|
30
31
|
"@types/express": "^4.17.22",
|
|
32
|
+
"@types/express-session": "^1.18.2",
|
|
33
|
+
"@types/node-forge": "1.3.13",
|
|
34
|
+
"@types/react": "17.0.87",
|
|
35
|
+
"@types/supertest": "^6.0.3",
|
|
31
36
|
"react": "17.0.2",
|
|
32
|
-
"
|
|
37
|
+
"supertest": "^7.2.2",
|
|
38
|
+
"typescript": "^5.9.3",
|
|
39
|
+
"vitest": "^4.0.18"
|
|
33
40
|
},
|
|
34
41
|
"dependencies": {
|
|
35
42
|
"@aws-sdk/client-dynamodb": "^3.817.0",
|
|
@@ -43,8 +50,8 @@
|
|
|
43
50
|
"helmet": "^8.1.0",
|
|
44
51
|
"http-proxy-middleware": "^3.0.5",
|
|
45
52
|
"jose": "^6.0.11",
|
|
46
|
-
"node-forge": "
|
|
47
|
-
"openid-client": "^
|
|
53
|
+
"node-forge": "1.3.3",
|
|
54
|
+
"openid-client": "^6.8.1",
|
|
48
55
|
"string-replace-middleware": "^1.1.0"
|
|
49
56
|
}
|
|
50
57
|
}
|
package/dist/client.d.mts
DELETED
package/dist/client.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","sourceRoot":"","sources":["../src/client.mjs"],"names":[],"mappings":"AAKA;IAME,yBAEC;IAED,sBASC;IAyDD,kBAEC;;CAEF"}
|
package/dist/client.mjs
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
11
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
12
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
13
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
14
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
15
|
-
};
|
|
16
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
17
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
18
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
19
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
20
|
-
};
|
|
21
|
-
var _OidcClientManager_instances, _OidcClientManager_issuer, _OidcClientManager_config, _OidcClientManager_client, _OidcClientManager_p12ToJwks, _OidcClientManager_createKeyStoreFromOkData, _OidcClientManager_createClient;
|
|
22
|
-
import forge from "node-forge";
|
|
23
|
-
import * as jose from 'jose';
|
|
24
|
-
import { Issuer } from "openid-client";
|
|
25
|
-
import { getSsmParameter } from "./config.mjs";
|
|
26
|
-
export class OidcClientManager {
|
|
27
|
-
constructor(config) {
|
|
28
|
-
_OidcClientManager_instances.add(this);
|
|
29
|
-
_OidcClientManager_issuer.set(this, void 0);
|
|
30
|
-
_OidcClientManager_config.set(this, void 0);
|
|
31
|
-
_OidcClientManager_client.set(this, void 0);
|
|
32
|
-
__classPrivateFieldSet(this, _OidcClientManager_config, config, "f");
|
|
33
|
-
}
|
|
34
|
-
init() {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
__classPrivateFieldSet(this, _OidcClientManager_issuer, yield Issuer.discover(__classPrivateFieldGet(this, _OidcClientManager_config, "f").oidcDiscoveryUri), "f");
|
|
37
|
-
__classPrivateFieldSet(this, _OidcClientManager_client, yield __classPrivateFieldGet(this, _OidcClientManager_instances, "m", _OidcClientManager_createClient).call(this), "f");
|
|
38
|
-
if (__classPrivateFieldGet(this, _OidcClientManager_config, "f").okDataIdPortenKeyName) {
|
|
39
|
-
setInterval(() => __awaiter(this, void 0, void 0, function* () {
|
|
40
|
-
__classPrivateFieldSet(this, _OidcClientManager_client, yield __classPrivateFieldGet(this, _OidcClientManager_instances, "m", _OidcClientManager_createClient).call(this), "f");
|
|
41
|
-
}), 5 * 60 * 1000);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
get client() {
|
|
46
|
-
return __classPrivateFieldGet(this, _OidcClientManager_client, "f");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
_OidcClientManager_issuer = new WeakMap(), _OidcClientManager_config = new WeakMap(), _OidcClientManager_client = new WeakMap(), _OidcClientManager_instances = new WeakSet(), _OidcClientManager_p12ToJwks = function _OidcClientManager_p12ToJwks(okdataP12) {
|
|
50
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
const p12Der = forge.util.decode64(okdataP12.keystore);
|
|
52
|
-
const p12Asn1 = forge.asn1.fromDer(p12Der);
|
|
53
|
-
const p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, okdataP12.key_password);
|
|
54
|
-
const privateKey = p12.getBagsByFriendlyName(okdataP12.key_alias)[0].key;
|
|
55
|
-
const privateKeyAsn1 = forge.pki.privateKeyToAsn1(privateKey);
|
|
56
|
-
const privateKeyInfo = forge.pki.wrapRsaPrivateKey(privateKeyAsn1);
|
|
57
|
-
const pem = forge.pki.privateKeyInfoToPem(privateKeyInfo);
|
|
58
|
-
const k = yield jose.importPKCS8(pem, 'RS256', { extractable: true });
|
|
59
|
-
const jwk = yield jose.exportJWK(k);
|
|
60
|
-
jwk.kid = okdataP12.key_id;
|
|
61
|
-
jwk.use = 'sig';
|
|
62
|
-
jwk.alg = 'RS256';
|
|
63
|
-
return {
|
|
64
|
-
keys: [jwk]
|
|
65
|
-
};
|
|
66
|
-
});
|
|
67
|
-
}, _OidcClientManager_createKeyStoreFromOkData = function _OidcClientManager_createKeyStoreFromOkData(ssmName) {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
const keyString = yield getSsmParameter(ssmName);
|
|
70
|
-
const okdataP12 = JSON.parse(keyString);
|
|
71
|
-
return yield __classPrivateFieldGet(this, _OidcClientManager_instances, "m", _OidcClientManager_p12ToJwks).call(this, okdataP12);
|
|
72
|
-
});
|
|
73
|
-
}, _OidcClientManager_createClient = function _OidcClientManager_createClient() {
|
|
74
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
-
let keyStore;
|
|
76
|
-
if (__classPrivateFieldGet(this, _OidcClientManager_config, "f").okDataIdPortenKeyName) {
|
|
77
|
-
keyStore = yield __classPrivateFieldGet(this, _OidcClientManager_instances, "m", _OidcClientManager_createKeyStoreFromOkData).call(this, __classPrivateFieldGet(this, _OidcClientManager_config, "f").okDataIdPortenKeyName);
|
|
78
|
-
}
|
|
79
|
-
else if (__classPrivateFieldGet(this, _OidcClientManager_config, "f").keyStore) {
|
|
80
|
-
keyStore = __classPrivateFieldGet(this, _OidcClientManager_config, "f").keyStore;
|
|
81
|
-
}
|
|
82
|
-
return new (__classPrivateFieldGet(this, _OidcClientManager_issuer, "f").Client)({
|
|
83
|
-
client_id: __classPrivateFieldGet(this, _OidcClientManager_config, "f").clientId,
|
|
84
|
-
client_secret: __classPrivateFieldGet(this, _OidcClientManager_config, "f").clientSecret,
|
|
85
|
-
redirect_uris: [__classPrivateFieldGet(this, _OidcClientManager_config, "f").redirectUri],
|
|
86
|
-
response_types: ["code"],
|
|
87
|
-
token_endpoint_auth_method: __classPrivateFieldGet(this, _OidcClientManager_config, "f").clientSecret ? "client_secret_post" : "private_key_jwt",
|
|
88
|
-
token_endpoint_auth_signing_alg: "RS256",
|
|
89
|
-
post_logout_redirect_uris: __classPrivateFieldGet(this, _OidcClientManager_config, "f").postLogoutRedirectUris
|
|
90
|
-
}, keyStore);
|
|
91
|
-
});
|
|
92
|
-
};
|
package/dist/config.d.mts
DELETED
package/dist/config.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.mts","sourceRoot":"","sources":["../src/config.mjs"],"names":[],"mappings":"AAGA,qEAQC;AAGD,mFAMC;AAWD,8DAyBC"}
|
package/dist/config.mjs
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { findUp } from 'find-up';
|
|
11
|
-
import { GetParameterCommand, SSMClient } from "@aws-sdk/client-ssm";
|
|
12
|
-
export function getEnv(env, defaultVal, parseFn) {
|
|
13
|
-
if (process.env[env]) {
|
|
14
|
-
return parseFn ? parseFn(process.env[env]) : process.env[env];
|
|
15
|
-
}
|
|
16
|
-
else if (defaultVal !== undefined) {
|
|
17
|
-
return defaultVal;
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
throw Error(`Missing env var: ${env}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
let ssmClient;
|
|
24
|
-
export function getSsmParameter(name_1) {
|
|
25
|
-
return __awaiter(this, arguments, void 0, function* (name, withDecryption = true) {
|
|
26
|
-
ssmClient !== null && ssmClient !== void 0 ? ssmClient : (ssmClient = new SSMClient({}));
|
|
27
|
-
return ssmClient.send(new GetParameterCommand({
|
|
28
|
-
Name: name,
|
|
29
|
-
WithDecryption: withDecryption
|
|
30
|
-
})).then(p => p.Parameter.Value);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
const defaultConfig = {
|
|
34
|
-
basePath: "",
|
|
35
|
-
cookiePath: '/',
|
|
36
|
-
cookieSecure: true,
|
|
37
|
-
cookieSameSite: 'lax',
|
|
38
|
-
staticRootPath: './dist'
|
|
39
|
-
};
|
|
40
|
-
let config;
|
|
41
|
-
export function loadConfig() {
|
|
42
|
-
return __awaiter(this, arguments, void 0, function* (configFile = 'bff.config.json') {
|
|
43
|
-
var _a;
|
|
44
|
-
if (config)
|
|
45
|
-
return config;
|
|
46
|
-
const userConfigPath = yield findUp(configFile);
|
|
47
|
-
if (!userConfigPath) {
|
|
48
|
-
throw Error(`Could not find config file ${configFile}`);
|
|
49
|
-
}
|
|
50
|
-
console.log('Loading config at', userConfigPath);
|
|
51
|
-
const { default: loadedConfig } = yield import(userConfigPath, { with: { type: 'json' } });
|
|
52
|
-
for (const [key, value] of Object.entries(loadedConfig)) {
|
|
53
|
-
if (typeof value === "string") {
|
|
54
|
-
const [, varType, varName] = (_a = value.match(/\{(\w+):(.*)}/)) !== null && _a !== void 0 ? _a : [];
|
|
55
|
-
if (varType === 'env') {
|
|
56
|
-
loadedConfig[key] = getEnv(varName);
|
|
57
|
-
}
|
|
58
|
-
else if (varType === 'ssm') {
|
|
59
|
-
loadedConfig[key] = yield getSsmParameter(varName);
|
|
60
|
-
}
|
|
61
|
-
else if (varType) {
|
|
62
|
-
throw Error(`unknown varType: ${varType}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
config = Object.assign(Object.assign({}, defaultConfig), loadedConfig);
|
|
67
|
-
return config;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oidc-routes.d.mts","sourceRoot":"","sources":["../../src/middleware/oidc-routes.mjs"],"names":[],"mappings":"AAEA,qDAUC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export class OidcMiddleware {
|
|
2
|
-
static create(config: any): Promise<OidcMiddleware>;
|
|
3
|
-
/**
|
|
4
|
-
* @private
|
|
5
|
-
* @param config
|
|
6
|
-
* @param clientManager
|
|
7
|
-
*/
|
|
8
|
-
private constructor();
|
|
9
|
-
get ensureFreshToken(): (req: any, res: any, next: any) => void;
|
|
10
|
-
get login(): (req: any, res: any) => void;
|
|
11
|
-
get callback(): (req: any, res: any, next: any) => Promise<void>;
|
|
12
|
-
get user(): (req: any, res: any, next: any) => Promise<any>;
|
|
13
|
-
get logout(): (req: any, res: any) => void;
|
|
14
|
-
get frontChannelLogout(): (req: any, res: any) => Promise<void>;
|
|
15
|
-
#private;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=oidc.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oidc.d.mts","sourceRoot":"","sources":["../../src/middleware/oidc.mjs"],"names":[],"mappings":"AAIA;IAeE,oDAIC;IAdD;;;;OAIG;IACH,sBAGC;IAsDD,yBACU,QAAG,EAAE,QAAG,EAAE,SAAI,UAWvB;IAED,cACU,QAAG,EAAE,QAAG,UAsBjB;IAED,iBACgB,QAAG,EAAE,QAAG,EAAE,SAAI,mBAqC7B;IAED,aACgB,QAAG,EAAE,QAAG,EAAE,SAAI,kBAmB7B;IAED,eACU,QAAG,EAAE,QAAG,UAQjB;IAED,2BACgB,QAAG,EAAE,QAAG,mBAcvB;;CACF"}
|