@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
|
};
|
|
@@ -37,6 +37,7 @@ const helpers_1 = require("../../misc/helpers");
|
|
|
37
37
|
const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
|
|
38
38
|
const config = configProvider[(0, guards_1.ifDefined)(configSpace, 'launch')];
|
|
39
39
|
const getTrustedDomain = (0, helpers_1.once)(() => (0, config_1.resolveConfigValue)(config.trustedDomain));
|
|
40
|
+
const getBypassSignatureVerification = (0, helpers_1.once)(async () => (await (0, config_1.resolveConfigValue)(config.bypassSignatureVerification)) === 'true');
|
|
40
41
|
const getJwksClient = (0, __1.memoize)((jwksUri) => new jwks_rsa_1.JwksClient({ fetcher, jwksUri }));
|
|
41
42
|
const getJwksKey = (0, __1.memoize)(async (jwksUri, kid) => {
|
|
42
43
|
const client = getJwksClient(jwksUri);
|
|
@@ -63,25 +64,26 @@ const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
|
|
|
63
64
|
}
|
|
64
65
|
};
|
|
65
66
|
return (_services, getDefaultToken) => {
|
|
66
|
-
const verify = (...args) => {
|
|
67
|
+
const verify = async (...args) => {
|
|
67
68
|
const [inputToken, validator] = args.length === 1
|
|
68
69
|
? typeof args[0] === 'string'
|
|
69
70
|
? [args[0], undefined]
|
|
70
71
|
: [undefined, args[0]]
|
|
71
72
|
: args;
|
|
73
|
+
const bypassSignatureVerification = await getBypassSignatureVerification();
|
|
72
74
|
return new Promise((resolve, reject) => {
|
|
73
75
|
const token = inputToken !== null && inputToken !== void 0 ? inputToken : getDefaultToken === null || getDefaultToken === void 0 ? void 0 : getDefaultToken();
|
|
74
76
|
if (!token) {
|
|
75
77
|
return reject(new errors_1.InvalidRequestError('Missing token for launch verification'));
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
const resolvePayload = (err, payload) => {
|
|
78
80
|
if (err && err instanceof jsonwebtoken_1.TokenExpiredError) {
|
|
79
81
|
reject(new errors_1.SessionExpiredError());
|
|
80
82
|
}
|
|
81
83
|
else if (err) {
|
|
82
84
|
reject(err);
|
|
83
85
|
}
|
|
84
|
-
else if (typeof payload !== 'object') {
|
|
86
|
+
else if (typeof payload !== 'object' || payload === null) {
|
|
85
87
|
reject(new Error('received JWT token with unexpected non-JSON payload'));
|
|
86
88
|
}
|
|
87
89
|
else if (!payload.sub) {
|
|
@@ -102,7 +104,13 @@ const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
|
|
|
102
104
|
// conditional return types are annoying
|
|
103
105
|
resolve((validator ? validator(parsed) : parsed));
|
|
104
106
|
}
|
|
105
|
-
}
|
|
107
|
+
};
|
|
108
|
+
if (bypassSignatureVerification) {
|
|
109
|
+
return resolvePayload(null, jsonwebtoken_1.default.decode(token));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return jsonwebtoken_1.default.verify(token, getKey, {}, resolvePayload);
|
|
113
|
+
}
|
|
106
114
|
});
|
|
107
115
|
};
|
|
108
116
|
return { verify };
|