@openstax/ts-utils 1.28.1 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/services/launchParams/verifier.d.ts +2 -0
- package/dist/cjs/services/launchParams/verifier.js +12 -4
- package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -1
- package/dist/esm/services/launchParams/verifier.d.ts +2 -0
- package/dist/esm/services/launchParams/verifier.js +12 -4
- package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ import type { JWK } from 'node-jose';
|
|
|
3
3
|
import { ConfigProviderForConfig } from '../../config';
|
|
4
4
|
declare type Config = {
|
|
5
5
|
trustedDomain: string;
|
|
6
|
+
bypassSignatureVerification: string;
|
|
6
7
|
};
|
|
7
8
|
interface Initializer<C> {
|
|
8
9
|
configSpace?: C;
|
|
@@ -15,6 +16,7 @@ interface Initializer<C> {
|
|
|
15
16
|
*/
|
|
16
17
|
export declare const createLaunchVerifier: <C extends string = "launch">({ configSpace, fetcher }: Initializer<C>) => (configProvider: { [key in C]: {
|
|
17
18
|
trustedDomain: import("../../config").ConfigValueProvider<string>;
|
|
19
|
+
bypassSignatureVerification: import("../../config").ConfigValueProvider<string>;
|
|
18
20
|
}; }) => (_services: {}, getDefaultToken?: (() => string) | undefined) => {
|
|
19
21
|
verify: <T = undefined>(...args: T extends undefined ? [] | [string] : [(input: any) => T] | [string, (input: any) => T]) => Promise<T extends undefined ? jwt.JwtPayload : T>;
|
|
20
22
|
};
|
|
@@ -11,6 +11,7 @@ import { once } from '../../misc/helpers';
|
|
|
11
11
|
export const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
|
|
12
12
|
const config = configProvider[ifDefined(configSpace, 'launch')];
|
|
13
13
|
const getTrustedDomain = once(() => resolveConfigValue(config.trustedDomain));
|
|
14
|
+
const getBypassSignatureVerification = once(async () => (await resolveConfigValue(config.bypassSignatureVerification)) === 'true');
|
|
14
15
|
const getJwksClient = memoize((jwksUri) => new JwksClient({ fetcher, jwksUri }));
|
|
15
16
|
const getJwksKey = memoize(async (jwksUri, kid) => {
|
|
16
17
|
const client = getJwksClient(jwksUri);
|
|
@@ -37,25 +38,26 @@ export const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvide
|
|
|
37
38
|
}
|
|
38
39
|
};
|
|
39
40
|
return (_services, getDefaultToken) => {
|
|
40
|
-
const verify = (...args) => {
|
|
41
|
+
const verify = async (...args) => {
|
|
41
42
|
const [inputToken, validator] = args.length === 1
|
|
42
43
|
? typeof args[0] === 'string'
|
|
43
44
|
? [args[0], undefined]
|
|
44
45
|
: [undefined, args[0]]
|
|
45
46
|
: args;
|
|
47
|
+
const bypassSignatureVerification = await getBypassSignatureVerification();
|
|
46
48
|
return new Promise((resolve, reject) => {
|
|
47
49
|
const token = inputToken !== null && inputToken !== void 0 ? inputToken : getDefaultToken === null || getDefaultToken === void 0 ? void 0 : getDefaultToken();
|
|
48
50
|
if (!token) {
|
|
49
51
|
return reject(new InvalidRequestError('Missing token for launch verification'));
|
|
50
52
|
}
|
|
51
|
-
|
|
53
|
+
const resolvePayload = (err, payload) => {
|
|
52
54
|
if (err && err instanceof TokenExpiredError) {
|
|
53
55
|
reject(new SessionExpiredError());
|
|
54
56
|
}
|
|
55
57
|
else if (err) {
|
|
56
58
|
reject(err);
|
|
57
59
|
}
|
|
58
|
-
else if (typeof payload !== 'object') {
|
|
60
|
+
else if (typeof payload !== 'object' || payload === null) {
|
|
59
61
|
reject(new Error('received JWT token with unexpected non-JSON payload'));
|
|
60
62
|
}
|
|
61
63
|
else if (!payload.sub) {
|
|
@@ -76,7 +78,13 @@ export const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvide
|
|
|
76
78
|
// conditional return types are annoying
|
|
77
79
|
resolve((validator ? validator(parsed) : parsed));
|
|
78
80
|
}
|
|
79
|
-
}
|
|
81
|
+
};
|
|
82
|
+
if (bypassSignatureVerification) {
|
|
83
|
+
return resolvePayload(null, jwt.decode(token));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return jwt.verify(token, getKey, {}, resolvePayload);
|
|
87
|
+
}
|
|
80
88
|
});
|
|
81
89
|
};
|
|
82
90
|
return { verify };
|