@liflig/cdk-cloudfront-auth 1.0.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/LICENSE +21 -0
- package/README.md +63 -0
- package/dist/check-auth/index.js +2 -0
- package/dist/check-auth/index.js.LICENSE.txt +17 -0
- package/dist/generate-secret/index.js +1 -0
- package/dist/http-headers/index.js +2 -0
- package/dist/http-headers/index.js.LICENSE.txt +6 -0
- package/dist/parse-auth/index.js +2 -0
- package/dist/parse-auth/index.js.LICENSE.txt +31 -0
- package/dist/refresh-auth/index.js +2 -0
- package/dist/refresh-auth/index.js.LICENSE.txt +31 -0
- package/dist/sign-out/index.js +2 -0
- package/dist/sign-out/index.js.LICENSE.txt +17 -0
- package/lib/client-secret.d.ts +10 -0
- package/lib/client-secret.js +54 -0
- package/lib/client-update.d.ts +14 -0
- package/lib/client-update.js +59 -0
- package/lib/cloudfront-auth.d.ts +132 -0
- package/lib/cloudfront-auth.js +267 -0
- package/lib/generate-secret.d.ts +15 -0
- package/lib/generate-secret.js +71 -0
- package/lib/handlers/check-auth.d.ts +7 -0
- package/lib/handlers/generate-secret.d.ts +9 -0
- package/lib/handlers/http-headers.d.ts +1 -0
- package/lib/handlers/parse-auth.d.ts +1 -0
- package/lib/handlers/refresh-auth.d.ts +1 -0
- package/lib/handlers/sign-out.d.ts +1 -0
- package/lib/handlers/util/axios.d.ts +4 -0
- package/lib/handlers/util/axios.js +42 -0
- package/lib/handlers/util/base64.d.ts +8 -0
- package/lib/handlers/util/base64.js +26 -0
- package/lib/handlers/util/cloudfront.d.ts +17 -0
- package/lib/handlers/util/cloudfront.js +102 -0
- package/lib/handlers/util/config.d.ts +26 -0
- package/lib/handlers/util/config.js +48 -0
- package/lib/handlers/util/cookies.d.ts +29 -0
- package/lib/handlers/util/cookies.js +115 -0
- package/lib/handlers/util/jwt.d.ts +17 -0
- package/lib/handlers/util/jwt.js +59 -0
- package/lib/handlers/util/logger.d.ts +16 -0
- package/lib/handlers/util/logger.js +55 -0
- package/lib/handlers/util/nonce.d.ts +9 -0
- package/lib/handlers/util/nonce.js +47 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +19 -0
- package/lib/lambdas.d.ts +33 -0
- package/lib/lambdas.js +88 -0
- package/package.json +75 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.GenerateSecret = void 0;
|
|
27
|
+
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
28
|
+
const cr = __importStar(require("aws-cdk-lib/custom-resources"));
|
|
29
|
+
const path = __importStar(require("path"));
|
|
30
|
+
const constructs_1 = require("constructs");
|
|
31
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
32
|
+
/**
|
|
33
|
+
* Generate a secret to be used in other parts of the deployment.
|
|
34
|
+
*/
|
|
35
|
+
class GenerateSecret extends constructs_1.Construct {
|
|
36
|
+
constructor(scope, id, props) {
|
|
37
|
+
var _a;
|
|
38
|
+
super(scope, id);
|
|
39
|
+
const resource = new aws_cdk_lib_1.CustomResource(this, "Resource", {
|
|
40
|
+
serviceToken: GenerateSecretProvider.getOrCreate(this).serviceToken,
|
|
41
|
+
properties: {
|
|
42
|
+
Nonce: (_a = props === null || props === void 0 ? void 0 : props.nonce) !== null && _a !== void 0 ? _a : "",
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
this.value = resource.getAttString("Value");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.GenerateSecret = GenerateSecret;
|
|
49
|
+
class GenerateSecretProvider extends constructs_1.Construct {
|
|
50
|
+
/**
|
|
51
|
+
* Returns the singleton provider.
|
|
52
|
+
*/
|
|
53
|
+
static getOrCreate(scope) {
|
|
54
|
+
const stack = aws_cdk_lib_1.Stack.of(scope);
|
|
55
|
+
const id = "liflig-infra.cloudfront-auth.generate-secret.provider";
|
|
56
|
+
return (stack.node.tryFindChild(id) ||
|
|
57
|
+
new GenerateSecretProvider(stack, id));
|
|
58
|
+
}
|
|
59
|
+
constructor(scope, id) {
|
|
60
|
+
super(scope, id);
|
|
61
|
+
this.provider = new cr.Provider(this, "Provider", {
|
|
62
|
+
onEventHandler: new lambda.Function(this, "Function", {
|
|
63
|
+
code: lambda.Code.fromAsset(path.join(__dirname, "../dist/generate-secret")),
|
|
64
|
+
handler: "index.handler",
|
|
65
|
+
runtime: lambda.Runtime.NODEJS_16_X,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
this.serviceToken = this.provider.serviceToken;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtc2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRlLXNlY3JldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtEQUFnRDtBQUNoRCxpRUFBa0Q7QUFDbEQsMkNBQTRCO0FBQzVCLDJDQUFzQztBQUN0Qyw2Q0FBbUQ7QUFTbkQ7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxzQkFBUztJQUczQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCOztRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3BELFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWTtZQUNuRSxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssbUNBQUksRUFBRTthQUMxQjtTQUNGLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0NBQ0Y7QUFmRCx3Q0FlQztBQUVELE1BQU0sc0JBQXVCLFNBQVEsc0JBQVM7SUFDNUM7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQWdCO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdCLE1BQU0sRUFBRSxHQUFHLHVEQUF1RCxDQUFBO1FBQ2xFLE9BQU8sQ0FDSixLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQTRCO1lBQ3ZELElBQUksc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUN0QyxDQUFBO0lBQ0gsQ0FBQztJQUtELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNoRCxjQUFjLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3BELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FDaEQ7Z0JBQ0QsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7YUFDcEMsQ0FBQztTQUNILENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUE7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlU2VjcmV0UHJvcHMge1xuICAvKipcbiAgICogTm9uY2UgdG8gZm9yY2Ugc2VjcmV0IHVwZGF0ZS5cbiAgICovXG4gIG5vbmNlPzogc3RyaW5nXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzZWNyZXQgdG8gYmUgdXNlZCBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdlbmVyYXRlU2VjcmV0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IEdlbmVyYXRlU2VjcmV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogR2VuZXJhdGVTZWNyZXRQcm92aWRlci5nZXRPckNyZWF0ZSh0aGlzKS5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIE5vbmNlOiBwcm9wcz8ubm9uY2UgPz8gXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHRoaXMudmFsdWUgPSByZXNvdXJjZS5nZXRBdHRTdHJpbmcoXCJWYWx1ZVwiKVxuICB9XG59XG5cbmNsYXNzIEdlbmVyYXRlU2VjcmV0UHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRPckNyZWF0ZShzY29wZTogQ29uc3RydWN0KSB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSlcbiAgICBjb25zdCBpZCA9IFwibGlmbGlnLWluZnJhLmNsb3VkZnJvbnQtYXV0aC5nZW5lcmF0ZS1zZWNyZXQucHJvdmlkZXJcIlxuICAgIHJldHVybiAoXG4gICAgICAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoaWQpIGFzIEdlbmVyYXRlU2VjcmV0UHJvdmlkZXIpIHx8XG4gICAgICBuZXcgR2VuZXJhdGVTZWNyZXRQcm92aWRlcihzdGFjaywgaWQpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlcjogY3IuUHJvdmlkZXJcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgXCJQcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcIkZ1bmN0aW9uXCIsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vZGlzdC9nZW5lcmF0ZS1zZWNyZXRcIiksXG4gICAgICAgICksXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIH0pLFxuICAgIH0pXG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHRoaXMucHJvdmlkZXIuc2VydmljZVRva2VuXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Config } from "./util/config";
|
|
2
|
+
import { IdTokenPayload } from "./util/jwt";
|
|
3
|
+
export declare const handler: import("aws-lambda").CloudFrontRequestHandler;
|
|
4
|
+
/**
|
|
5
|
+
* Check if the user is authorized to access the resource.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isAuthorized(config: Config, idToken: IdTokenPayload): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handler: import("aws-lambda").CloudFrontResponseHandler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handler: import("aws-lambda").CloudFrontRequestHandler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handler: import("aws-lambda").CloudFrontRequestHandler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handler: import("aws-lambda").CloudFrontRequestHandler;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.httpPostWithRetry = void 0;
|
|
9
|
+
// Workaround for https://github.com/axios/axios/issues/3219
|
|
10
|
+
/// <reference lib="dom" />
|
|
11
|
+
const axios_1 = __importDefault(require("axios"));
|
|
12
|
+
const https_1 = require("https");
|
|
13
|
+
const axiosInstance = axios_1.default.create({
|
|
14
|
+
httpsAgent: new https_1.Agent({ keepAlive: true }),
|
|
15
|
+
});
|
|
16
|
+
async function httpPostWithRetry(url, data, config, logger) {
|
|
17
|
+
let attempts = 0;
|
|
18
|
+
while (true) {
|
|
19
|
+
++attempts;
|
|
20
|
+
try {
|
|
21
|
+
return await axiosInstance.post(url, data, config);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
logger.debug(`HTTP POST to ${url} failed (attempt ${attempts}):`);
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
26
|
+
logger.debug((err.response && err.response.data) || err);
|
|
27
|
+
if (attempts >= 5) {
|
|
28
|
+
// Try 5 times at most.
|
|
29
|
+
logger.error(`No success after ${attempts} attempts, seizing further attempts`);
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
if (attempts >= 2) {
|
|
33
|
+
// After attempting twice immediately, do some exponential backoff with jitter.
|
|
34
|
+
logger.debug("Doing exponential backoff with jitter, before attempting HTTP POST again ...");
|
|
35
|
+
await new Promise((resolve) => setTimeout(resolve, 25 * (Math.pow(2, attempts) + Math.random() * attempts)));
|
|
36
|
+
logger.debug("Done waiting, will try HTTP POST again now");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.httpPostWithRetry = httpPostWithRetry;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvdXRpbC9heGlvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsdURBQXVEO0FBQ3ZELHNFQUFzRTs7Ozs7O0FBRXRFLDREQUE0RDtBQUM1RCwyQkFBMkI7QUFFM0Isa0RBQWdFO0FBQ2hFLGlDQUE2QjtBQUc3QixNQUFNLGFBQWEsR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxJQUFJLGFBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUMzQyxDQUFDLENBQUE7QUFFSyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEdBQVcsRUFDWCxJQUFTLEVBQ1QsTUFBMEIsRUFDMUIsTUFBYztJQUVkLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtJQUNoQixPQUFPLElBQUksRUFBRTtRQUNYLEVBQUUsUUFBUSxDQUFBO1FBQ1YsSUFBSTtZQUNGLE9BQU8sTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7U0FDbkQ7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLG9CQUFvQixRQUFRLElBQUksQ0FBQyxDQUFBO1lBQ2pFLHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBQ3hELElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtnQkFDakIsdUJBQXVCO2dCQUN2QixNQUFNLENBQUMsS0FBSyxDQUNWLG9CQUFvQixRQUFRLHFDQUFxQyxDQUNsRSxDQUFBO2dCQUNELE1BQU0sR0FBRyxDQUFBO2FBQ1Y7WUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pCLCtFQUErRTtnQkFDL0UsTUFBTSxDQUFDLEtBQUssQ0FDViw4RUFBOEUsQ0FDL0UsQ0FBQTtnQkFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDNUIsVUFBVSxDQUNSLE9BQU8sRUFDUCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQ3hELENBQ0YsQ0FBQTtnQkFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7YUFDM0Q7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQXJDRCw4Q0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG5cbi8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcy9pc3N1ZXMvMzIxOVxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZG9tXCIgLz5cblxuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJodHRwc1wiXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXJcIlxuXG5jb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKHtcbiAgaHR0cHNBZ2VudDogbmV3IEFnZW50KHsga2VlcEFsaXZlOiB0cnVlIH0pLFxufSlcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh0dHBQb3N0V2l0aFJldHJ5KFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuICBjb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8YW55Pj4ge1xuICBsZXQgYXR0ZW1wdHMgPSAwXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgKythdHRlbXB0c1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXhpb3NJbnN0YW5jZS5wb3N0KHVybCwgZGF0YSwgY29uZmlnKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEhUVFAgUE9TVCB0byAke3VybH0gZmFpbGVkIChhdHRlbXB0ICR7YXR0ZW1wdHN9KTpgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgbG9nZ2VyLmRlYnVnKChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLmRhdGEpIHx8IGVycilcbiAgICAgIGlmIChhdHRlbXB0cyA+PSA1KSB7XG4gICAgICAgIC8vIFRyeSA1IHRpbWVzIGF0IG1vc3QuXG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgTm8gc3VjY2VzcyBhZnRlciAke2F0dGVtcHRzfSBhdHRlbXB0cywgc2VpemluZyBmdXJ0aGVyIGF0dGVtcHRzYCxcbiAgICAgICAgKVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0cyA+PSAyKSB7XG4gICAgICAgIC8vIEFmdGVyIGF0dGVtcHRpbmcgdHdpY2UgaW1tZWRpYXRlbHksIGRvIHNvbWUgZXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlci5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIFwiRG9pbmcgZXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlciwgYmVmb3JlIGF0dGVtcHRpbmcgSFRUUCBQT1NUIGFnYWluIC4uLlwiLFxuICAgICAgICApXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgMjUgKiAoTWF0aC5wb3coMiwgYXR0ZW1wdHMpICsgTWF0aC5yYW5kb20oKSAqIGF0dGVtcHRzKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkRvbmUgd2FpdGluZywgd2lsbCB0cnkgSFRUUCBQT1NUIGFnYWluIG5vd1wiKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use this on a base64-encoded string to translate = + / into replacement characters.
|
|
3
|
+
*/
|
|
4
|
+
export declare function safeBase64Stringify(value: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Decode a Base64 value that is run through safeBase64Stringify to the actual string.
|
|
7
|
+
*/
|
|
8
|
+
export declare function decodeSafeBase64(value: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Functions to translate base64-encoded strings, so they can be used:
|
|
4
|
+
|
|
5
|
+
- in URL's without needing additional encoding
|
|
6
|
+
- in OAuth2 PKCE verifier
|
|
7
|
+
- in cookies (to be on the safe side, as = + / are in fact valid characters in cookies)
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.decodeSafeBase64 = exports.safeBase64Stringify = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Use this on a base64-encoded string to translate = + / into replacement characters.
|
|
13
|
+
*/
|
|
14
|
+
function safeBase64Stringify(value) {
|
|
15
|
+
return value.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
16
|
+
}
|
|
17
|
+
exports.safeBase64Stringify = safeBase64Stringify;
|
|
18
|
+
/**
|
|
19
|
+
* Decode a Base64 value that is run through safeBase64Stringify to the actual string.
|
|
20
|
+
*/
|
|
21
|
+
function decodeSafeBase64(value) {
|
|
22
|
+
const desafed = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
23
|
+
return Buffer.from(desafed, "base64").toString();
|
|
24
|
+
}
|
|
25
|
+
exports.decodeSafeBase64 = decodeSafeBase64;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hhbmRsZXJzL3V0aWwvYmFzZTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0VBTUU7OztBQUVGOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsS0FBYTtJQUMvQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUN4RSxDQUFDO0FBRkQsa0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWE7SUFDNUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUMzRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBQ2xELENBQUM7QUFIRCw0Q0FHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5GdW5jdGlvbnMgdG8gdHJhbnNsYXRlIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MsIHNvIHRoZXkgY2FuIGJlIHVzZWQ6XG5cbiAgLSBpbiBVUkwncyB3aXRob3V0IG5lZWRpbmcgYWRkaXRpb25hbCBlbmNvZGluZ1xuICAtIGluIE9BdXRoMiBQS0NFIHZlcmlmaWVyXG4gIC0gaW4gY29va2llcyAodG8gYmUgb24gdGhlIHNhZmUgc2lkZSwgYXMgPSArIC8gYXJlIGluIGZhY3QgdmFsaWQgY2hhcmFjdGVycyBpbiBjb29raWVzKVxuKi9cblxuLyoqXG4gKiBVc2UgdGhpcyBvbiBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZyB0byB0cmFuc2xhdGUgPSArIC8gaW50byByZXBsYWNlbWVudCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZUJhc2U2NFN0cmluZ2lmeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLz0vZywgXCJcIikucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpXG59XG5cbi8qKlxuICogRGVjb2RlIGEgQmFzZTY0IHZhbHVlIHRoYXQgaXMgcnVuIHRocm91Z2ggc2FmZUJhc2U2NFN0cmluZ2lmeSB0byB0aGUgYWN0dWFsIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVNhZmVCYXNlNjQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRlc2FmZWQgPSB2YWx1ZS5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKVxuICByZXR1cm4gQnVmZmVyLmZyb20oZGVzYWZlZCwgXCJiYXNlNjRcIikudG9TdHJpbmcoKVxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CloudFrontRequestEvent, CloudFrontRequestHandler, CloudFrontRequestResult, CloudFrontResponseEvent, CloudFrontResponseHandler, CloudFrontResponseResult } from "aws-lambda";
|
|
2
|
+
import { Config } from "./config";
|
|
3
|
+
export type HttpHeaders = Record<string, string>;
|
|
4
|
+
export declare function redirectTo(path: string, props?: {
|
|
5
|
+
cookies?: string[];
|
|
6
|
+
}): CloudFrontResponseResult;
|
|
7
|
+
export declare function staticPage(props: {
|
|
8
|
+
title: string;
|
|
9
|
+
message: string;
|
|
10
|
+
details: string;
|
|
11
|
+
linkHref: string;
|
|
12
|
+
linkText: string;
|
|
13
|
+
statusCode?: string;
|
|
14
|
+
}): CloudFrontResponseResult;
|
|
15
|
+
export type RequestHandler = (config: Config, event: CloudFrontRequestEvent) => Promise<CloudFrontRequestResult>;
|
|
16
|
+
export declare function createRequestHandler(inner: RequestHandler): CloudFrontRequestHandler;
|
|
17
|
+
export declare function createResponseHandler(inner: (config: Config, event: CloudFrontResponseEvent) => Promise<CloudFrontResponseResult>): CloudFrontResponseHandler;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createResponseHandler = exports.createRequestHandler = exports.staticPage = exports.redirectTo = void 0;
|
|
7
|
+
const template_html_1 = __importDefault(require("../error-page/template.html"));
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
function asCloudFrontHeaders(headers) {
|
|
10
|
+
return Object.entries(headers).reduce((reduced, [key, value]) => Object.assign(reduced, {
|
|
11
|
+
[key.toLowerCase()]: [
|
|
12
|
+
{
|
|
13
|
+
key,
|
|
14
|
+
value,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
}), {});
|
|
18
|
+
}
|
|
19
|
+
function redirectTo(path, props) {
|
|
20
|
+
const headers = (props === null || props === void 0 ? void 0 : props.cookies)
|
|
21
|
+
? {
|
|
22
|
+
"set-cookie": props.cookies.map((value) => ({
|
|
23
|
+
key: "set-cookie",
|
|
24
|
+
value,
|
|
25
|
+
})),
|
|
26
|
+
}
|
|
27
|
+
: {};
|
|
28
|
+
return {
|
|
29
|
+
status: "307",
|
|
30
|
+
statusDescription: "Temporary Redirect",
|
|
31
|
+
headers: {
|
|
32
|
+
location: [
|
|
33
|
+
{
|
|
34
|
+
key: "location",
|
|
35
|
+
value: path,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
...headers,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
exports.redirectTo = redirectTo;
|
|
43
|
+
function staticPage(props) {
|
|
44
|
+
var _a;
|
|
45
|
+
return {
|
|
46
|
+
body: createErrorHtml(props),
|
|
47
|
+
status: (_a = props.statusCode) !== null && _a !== void 0 ? _a : "500",
|
|
48
|
+
headers: {
|
|
49
|
+
"content-type": [
|
|
50
|
+
{
|
|
51
|
+
key: "Content-Type",
|
|
52
|
+
value: "text/html; charset=UTF-8",
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
exports.staticPage = staticPage;
|
|
59
|
+
function createErrorHtml(props) {
|
|
60
|
+
const params = { ...props, region: process.env.AWS_REGION };
|
|
61
|
+
return template_html_1.default.replace(/\${([^}]*)}/g, (_, v) => params[v] || "");
|
|
62
|
+
}
|
|
63
|
+
function addCloudFrontHeaders(config, response) {
|
|
64
|
+
var _a;
|
|
65
|
+
if (!response) {
|
|
66
|
+
throw new Error("Expected response value");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
...response,
|
|
70
|
+
headers: {
|
|
71
|
+
...((_a = response.headers) !== null && _a !== void 0 ? _a : {}),
|
|
72
|
+
...asCloudFrontHeaders(config.httpHeaders),
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function createRequestHandler(inner) {
|
|
77
|
+
let config;
|
|
78
|
+
return async (event) => {
|
|
79
|
+
if (!config) {
|
|
80
|
+
config = (0, config_1.getConfig)();
|
|
81
|
+
}
|
|
82
|
+
config.logger.debug("Handling event:", event);
|
|
83
|
+
const response = addCloudFrontHeaders(config, await inner(config, event));
|
|
84
|
+
config.logger.debug("Returning response:", response);
|
|
85
|
+
return response;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
exports.createRequestHandler = createRequestHandler;
|
|
89
|
+
function createResponseHandler(inner) {
|
|
90
|
+
let config;
|
|
91
|
+
return async (event) => {
|
|
92
|
+
if (!config) {
|
|
93
|
+
config = (0, config_1.getConfig)();
|
|
94
|
+
}
|
|
95
|
+
config.logger.debug("Handling event:", event);
|
|
96
|
+
const response = addCloudFrontHeaders(config, await inner(config, event));
|
|
97
|
+
config.logger.debug("Returning response:", response);
|
|
98
|
+
return response;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
exports.createResponseHandler = createResponseHandler;
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy91dGlsL2Nsb3VkZnJvbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsZ0ZBQThDO0FBQzlDLHFDQUE0QztBQUk1QyxTQUFTLG1CQUFtQixDQUFDLE9BQW9CO0lBQy9DLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQ25DLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDckIsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUNuQjtnQkFDRSxHQUFHO2dCQUNILEtBQUs7YUFDTjtTQUNGO0tBQ0YsQ0FBQyxFQUNKLEVBQXVCLENBQ3hCLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUN4QixJQUFZLEVBQ1osS0FFQztJQUVELE1BQU0sT0FBTyxHQUFzQixDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxPQUFPO1FBQy9DLENBQUMsQ0FBQztZQUNFLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLEtBQUs7YUFDTixDQUFDLENBQUM7U0FDSjtRQUNILENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFTixPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUs7UUFDYixpQkFBaUIsRUFBRSxvQkFBb0I7UUFDdkMsT0FBTyxFQUFFO1lBQ1AsUUFBUSxFQUFFO2dCQUNSO29CQUNFLEdBQUcsRUFBRSxVQUFVO29CQUNmLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7WUFDRCxHQUFHLE9BQU87U0FDWDtLQUNGLENBQUE7QUFDSCxDQUFDO0FBNUJELGdDQTRCQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxLQU8xQjs7SUFDQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDNUIsTUFBTSxFQUFFLE1BQUEsS0FBSyxDQUFDLFVBQVUsbUNBQUksS0FBSztRQUNqQyxPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUU7Z0JBQ2Q7b0JBQ0UsR0FBRyxFQUFFLGNBQWM7b0JBQ25CLEtBQUssRUFBRSwwQkFBMEI7aUJBQ2xDO2FBQ0Y7U0FDRjtLQUNGLENBQUE7QUFDSCxDQUFDO0FBcEJELGdDQW9CQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBTXhCO0lBQ0MsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMzRCxPQUFPLHVCQUFJLENBQUMsT0FBTyxDQUNqQixjQUFjLEVBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBc0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDL0MsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUUzQixNQUFjLEVBQUUsUUFBVzs7SUFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtLQUMzQztJQUVELE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxPQUFPLEVBQUU7WUFDUCxHQUFHLENBQUMsTUFBQSxRQUFRLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUM7WUFDM0IsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1NBQzNDO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFPRCxTQUFnQixvQkFBb0IsQ0FDbEMsS0FBcUI7SUFFckIsSUFBSSxNQUFjLENBQUE7SUFFbEIsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxJQUFBLGtCQUFTLEdBQUUsQ0FBQTtTQUNyQjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRTdDLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUV6RSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNwRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDLENBQUE7QUFDSCxDQUFDO0FBakJELG9EQWlCQztBQUVELFNBQWdCLHFCQUFxQixDQUNuQyxLQUdzQztJQUV0QyxJQUFJLE1BQWMsQ0FBQTtJQUVsQixPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxHQUFHLElBQUEsa0JBQVMsR0FBRSxDQUFBO1NBQ3JCO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFN0MsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBRXpFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUMsQ0FBQTtBQUNILENBQUM7QUFwQkQsc0RBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2xvdWRGcm9udEhlYWRlcnMsXG4gIENsb3VkRnJvbnRSZXF1ZXN0RXZlbnQsXG4gIENsb3VkRnJvbnRSZXF1ZXN0SGFuZGxlcixcbiAgQ2xvdWRGcm9udFJlcXVlc3RSZXN1bHQsXG4gIENsb3VkRnJvbnRSZXNwb25zZUV2ZW50LFxuICBDbG91ZEZyb250UmVzcG9uc2VIYW5kbGVyLFxuICBDbG91ZEZyb250UmVzcG9uc2VSZXN1bHQsXG59IGZyb20gXCJhd3MtbGFtYmRhXCJcbmltcG9ydCBodG1sIGZyb20gXCIuLi9lcnJvci1wYWdlL3RlbXBsYXRlLmh0bWxcIlxuaW1wb3J0IHsgQ29uZmlnLCBnZXRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIlxuXG5leHBvcnQgdHlwZSBIdHRwSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuZnVuY3Rpb24gYXNDbG91ZEZyb250SGVhZGVycyhoZWFkZXJzOiBIdHRwSGVhZGVycyk6IENsb3VkRnJvbnRIZWFkZXJzIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLnJlZHVjZShcbiAgICAocmVkdWNlZCwgW2tleSwgdmFsdWVdKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihyZWR1Y2VkLCB7XG4gICAgICAgIFtrZXkudG9Mb3dlckNhc2UoKV06IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAge30gYXMgQ2xvdWRGcm9udEhlYWRlcnMsXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0VG8oXG4gIHBhdGg6IHN0cmluZyxcbiAgcHJvcHM/OiB7XG4gICAgY29va2llcz86IHN0cmluZ1tdXG4gIH0sXG4pOiBDbG91ZEZyb250UmVzcG9uc2VSZXN1bHQge1xuICBjb25zdCBoZWFkZXJzOiBDbG91ZEZyb250SGVhZGVycyA9IHByb3BzPy5jb29raWVzXG4gICAgPyB7XG4gICAgICAgIFwic2V0LWNvb2tpZVwiOiBwcm9wcy5jb29raWVzLm1hcCgodmFsdWUpID0+ICh7XG4gICAgICAgICAga2V5OiBcInNldC1jb29raWVcIixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSkpLFxuICAgICAgfVxuICAgIDoge31cblxuICByZXR1cm4ge1xuICAgIHN0YXR1czogXCIzMDdcIixcbiAgICBzdGF0dXNEZXNjcmlwdGlvbjogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICBsb2NhdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAga2V5OiBcImxvY2F0aW9uXCIsXG4gICAgICAgICAgdmFsdWU6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4uaGVhZGVycyxcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0aWNQYWdlKHByb3BzOiB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGRldGFpbHM6IHN0cmluZ1xuICBsaW5rSHJlZjogc3RyaW5nXG4gIGxpbmtUZXh0OiBzdHJpbmdcbiAgc3RhdHVzQ29kZT86IHN0cmluZ1xufSk6IENsb3VkRnJvbnRSZXNwb25zZVJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgYm9keTogY3JlYXRlRXJyb3JIdG1sKHByb3BzKSxcbiAgICBzdGF0dXM6IHByb3BzLnN0YXR1c0NvZGUgPz8gXCI1MDBcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICBcImNvbnRlbnQtdHlwZVwiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgdmFsdWU6IFwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JIdG1sKHByb3BzOiB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGRldGFpbHM6IHN0cmluZ1xuICBsaW5rSHJlZjogc3RyaW5nXG4gIGxpbmtUZXh0OiBzdHJpbmdcbn0pOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSB7IC4uLnByb3BzLCByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfVxuICByZXR1cm4gaHRtbC5yZXBsYWNlKFxuICAgIC9cXCR7KFtefV0qKX0vZyxcbiAgICAoXywgdjoga2V5b2YgdHlwZW9mIHBhcmFtcykgPT4gcGFyYW1zW3ZdIHx8IFwiXCIsXG4gIClcbn1cblxuZnVuY3Rpb24gYWRkQ2xvdWRGcm9udEhlYWRlcnM8XG4gIFQgZXh0ZW5kcyBDbG91ZEZyb250UmVxdWVzdFJlc3VsdCB8IENsb3VkRnJvbnRSZXNwb25zZVJlc3VsdCxcbj4oY29uZmlnOiBDb25maWcsIHJlc3BvbnNlOiBUKTogVCB7XG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCByZXNwb25zZSB2YWx1ZVwiKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNwb25zZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4ocmVzcG9uc2UuaGVhZGVycyA/PyB7fSksXG4gICAgICAuLi5hc0Nsb3VkRnJvbnRIZWFkZXJzKGNvbmZpZy5odHRwSGVhZGVycyksXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGFuZGxlciA9IChcbiAgY29uZmlnOiBDb25maWcsXG4gIGV2ZW50OiBDbG91ZEZyb250UmVxdWVzdEV2ZW50LFxuKSA9PiBQcm9taXNlPENsb3VkRnJvbnRSZXF1ZXN0UmVzdWx0PlxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdEhhbmRsZXIoXG4gIGlubmVyOiBSZXF1ZXN0SGFuZGxlcixcbik6IENsb3VkRnJvbnRSZXF1ZXN0SGFuZGxlciB7XG4gIGxldCBjb25maWc6IENvbmZpZ1xuXG4gIHJldHVybiBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uZmlnID0gZ2V0Q29uZmlnKClcbiAgICB9XG5cbiAgICBjb25maWcubG9nZ2VyLmRlYnVnKFwiSGFuZGxpbmcgZXZlbnQ6XCIsIGV2ZW50KVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhZGRDbG91ZEZyb250SGVhZGVycyhjb25maWcsIGF3YWl0IGlubmVyKGNvbmZpZywgZXZlbnQpKVxuXG4gICAgY29uZmlnLmxvZ2dlci5kZWJ1ZyhcIlJldHVybmluZyByZXNwb25zZTpcIiwgcmVzcG9uc2UpXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlSGFuZGxlcihcbiAgaW5uZXI6IChcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBldmVudDogQ2xvdWRGcm9udFJlc3BvbnNlRXZlbnQsXG4gICkgPT4gUHJvbWlzZTxDbG91ZEZyb250UmVzcG9uc2VSZXN1bHQ+LFxuKTogQ2xvdWRGcm9udFJlc3BvbnNlSGFuZGxlciB7XG4gIGxldCBjb25maWc6IENvbmZpZ1xuXG4gIHJldHVybiBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uZmlnID0gZ2V0Q29uZmlnKClcbiAgICB9XG5cbiAgICBjb25maWcubG9nZ2VyLmRlYnVnKFwiSGFuZGxpbmcgZXZlbnQ6XCIsIGV2ZW50KVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhZGRDbG91ZEZyb250SGVhZGVycyhjb25maWcsIGF3YWl0IGlubmVyKGNvbmZpZywgZXZlbnQpKVxuXG4gICAgY29uZmlnLmxvZ2dlci5kZWJ1ZyhcIlJldHVybmluZyByZXNwb25zZTpcIiwgcmVzcG9uc2UpXG4gICAgcmV0dXJuIHJlc3BvbnNlXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { HttpHeaders } from "./cloudfront";
|
|
2
|
+
import { CookieSettings } from "./cookies";
|
|
3
|
+
import { Logger, LogLevel } from "./logger";
|
|
4
|
+
export interface StoredConfig {
|
|
5
|
+
userPoolId: string;
|
|
6
|
+
clientId: string;
|
|
7
|
+
oauthScopes: string[];
|
|
8
|
+
cognitoAuthDomain: string;
|
|
9
|
+
callbackPath: string;
|
|
10
|
+
signOutRedirectTo: string;
|
|
11
|
+
signOutPath: string;
|
|
12
|
+
refreshAuthPath: string;
|
|
13
|
+
cookieSettings: CookieSettings;
|
|
14
|
+
httpHeaders: HttpHeaders;
|
|
15
|
+
clientSecret: string;
|
|
16
|
+
nonceSigningSecret: string;
|
|
17
|
+
logLevel: keyof typeof LogLevel;
|
|
18
|
+
requireGroupAnyOf?: string[] | null;
|
|
19
|
+
}
|
|
20
|
+
export interface Config extends StoredConfig {
|
|
21
|
+
tokenIssuer: string;
|
|
22
|
+
tokenJwksUri: string;
|
|
23
|
+
logger: Logger;
|
|
24
|
+
nonceMaxAge: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function getConfig(): Config;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.getConfig = void 0;
|
|
27
|
+
const cookie_1 = require("cookie");
|
|
28
|
+
const fs_1 = require("fs");
|
|
29
|
+
const path = __importStar(require("path"));
|
|
30
|
+
const logger_1 = require("./logger");
|
|
31
|
+
function getConfig() {
|
|
32
|
+
const config = JSON.parse((0, fs_1.readFileSync)(path.join(__dirname, "/config.json"), "utf-8"));
|
|
33
|
+
// Derive the issuer and JWKS uri all JWT's will be signed with from
|
|
34
|
+
// the User Pool's ID and region.
|
|
35
|
+
const userPoolRegion = /^(\S+?)_\S+$/.exec(config.userPoolId)[1];
|
|
36
|
+
const tokenIssuer = `https://cognito-idp.${userPoolRegion}.amazonaws.com/${config.userPoolId}`;
|
|
37
|
+
const tokenJwksUri = `${tokenIssuer}/.well-known/jwks.json`;
|
|
38
|
+
return {
|
|
39
|
+
nonceMaxAge: parseInt((0, cookie_1.parse)(config.cookieSettings.nonce.toLowerCase())["max-age"]) ||
|
|
40
|
+
60 * 60 * 24,
|
|
41
|
+
...config,
|
|
42
|
+
tokenIssuer,
|
|
43
|
+
tokenJwksUri,
|
|
44
|
+
logger: new logger_1.Logger(logger_1.LogLevel[config.logLevel]),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
exports.getConfig = getConfig;
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hhbmRsZXJzL3V0aWwvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThCO0FBQzlCLDJCQUFpQztBQUNqQywyQ0FBNEI7QUFHNUIscUNBQTJDO0FBMEIzQyxTQUFnQixTQUFTO0lBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3ZCLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FDNUMsQ0FBQTtJQUVqQixvRUFBb0U7SUFDcEUsaUNBQWlDO0lBQ2pDLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLHVCQUF1QixjQUFjLGtCQUFrQixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDOUYsTUFBTSxZQUFZLEdBQUcsR0FBRyxXQUFXLHdCQUF3QixDQUFBO0lBRTNELE9BQU87UUFDTCxXQUFXLEVBQ1QsUUFBUSxDQUFDLElBQUEsY0FBSyxFQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1FBQ2QsR0FBRyxNQUFNO1FBQ1QsV0FBVztRQUNYLFlBQVk7UUFDWixNQUFNLEVBQUUsSUFBSSxlQUFNLENBQUMsaUJBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDOUMsQ0FBQTtBQUNILENBQUM7QUFwQkQsOEJBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiY29va2llXCJcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSBcIi4vY2xvdWRmcm9udFwiXG5pbXBvcnQgeyBDb29raWVTZXR0aW5ncyB9IGZyb20gXCIuL2Nvb2tpZXNcIlxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZ2dlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkQ29uZmlnIHtcbiAgdXNlclBvb2xJZDogc3RyaW5nXG4gIGNsaWVudElkOiBzdHJpbmdcbiAgb2F1dGhTY29wZXM6IHN0cmluZ1tdXG4gIGNvZ25pdG9BdXRoRG9tYWluOiBzdHJpbmdcbiAgY2FsbGJhY2tQYXRoOiBzdHJpbmdcbiAgc2lnbk91dFJlZGlyZWN0VG86IHN0cmluZ1xuICBzaWduT3V0UGF0aDogc3RyaW5nXG4gIHJlZnJlc2hBdXRoUGF0aDogc3RyaW5nXG4gIGNvb2tpZVNldHRpbmdzOiBDb29raWVTZXR0aW5nc1xuICBodHRwSGVhZGVyczogSHR0cEhlYWRlcnNcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmdcbiAgbm9uY2VTaWduaW5nU2VjcmV0OiBzdHJpbmdcbiAgbG9nTGV2ZWw6IGtleW9mIHR5cGVvZiBMb2dMZXZlbFxuICByZXF1aXJlR3JvdXBBbnlPZj86IHN0cmluZ1tdIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZyBleHRlbmRzIFN0b3JlZENvbmZpZyB7XG4gIHRva2VuSXNzdWVyOiBzdHJpbmdcbiAgdG9rZW5Kd2tzVXJpOiBzdHJpbmdcbiAgbG9nZ2VyOiBMb2dnZXJcbiAgbm9uY2VNYXhBZ2U6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoXG4gICAgcmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsIFwiL2NvbmZpZy5qc29uXCIpLCBcInV0Zi04XCIpLFxuICApIGFzIFN0b3JlZENvbmZpZ1xuXG4gIC8vIERlcml2ZSB0aGUgaXNzdWVyIGFuZCBKV0tTIHVyaSBhbGwgSldUJ3Mgd2lsbCBiZSBzaWduZWQgd2l0aCBmcm9tXG4gIC8vIHRoZSBVc2VyIFBvb2wncyBJRCBhbmQgcmVnaW9uLlxuICBjb25zdCB1c2VyUG9vbFJlZ2lvbiA9IC9eKFxcUys/KV9cXFMrJC8uZXhlYyhjb25maWcudXNlclBvb2xJZCkhWzFdXG4gIGNvbnN0IHRva2VuSXNzdWVyID0gYGh0dHBzOi8vY29nbml0by1pZHAuJHt1c2VyUG9vbFJlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2NvbmZpZy51c2VyUG9vbElkfWBcbiAgY29uc3QgdG9rZW5Kd2tzVXJpID0gYCR7dG9rZW5Jc3N1ZXJ9Ly53ZWxsLWtub3duL2p3a3MuanNvbmBcblxuICByZXR1cm4ge1xuICAgIG5vbmNlTWF4QWdlOlxuICAgICAgcGFyc2VJbnQocGFyc2UoY29uZmlnLmNvb2tpZVNldHRpbmdzLm5vbmNlLnRvTG93ZXJDYXNlKCkpW1wibWF4LWFnZVwiXSkgfHxcbiAgICAgIDYwICogNjAgKiAyNCxcbiAgICAuLi5jb25maWcsXG4gICAgdG9rZW5Jc3N1ZXIsXG4gICAgdG9rZW5Kd2tzVXJpLFxuICAgIGxvZ2dlcjogbmV3IExvZ2dlcihMb2dMZXZlbFtjb25maWcubG9nTGV2ZWxdKSxcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CloudFrontHeaders } from "aws-lambda";
|
|
2
|
+
export interface CookieSettings {
|
|
3
|
+
idToken: string;
|
|
4
|
+
accessToken: string;
|
|
5
|
+
refreshToken: string;
|
|
6
|
+
nonce: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function extractAndParseCookies(headers: CloudFrontHeaders, clientId: string): {
|
|
9
|
+
tokenUserName?: string;
|
|
10
|
+
idToken?: string;
|
|
11
|
+
accessToken?: string;
|
|
12
|
+
refreshToken?: string;
|
|
13
|
+
scopes?: string;
|
|
14
|
+
nonce?: string;
|
|
15
|
+
nonceHmac?: string;
|
|
16
|
+
pkce?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function generateCookies(param: {
|
|
19
|
+
event: "newTokens" | "signOut" | "refreshFailed";
|
|
20
|
+
clientId: string;
|
|
21
|
+
oauthScopes: string[];
|
|
22
|
+
domainName: string;
|
|
23
|
+
cookieSettings: CookieSettings;
|
|
24
|
+
tokens: {
|
|
25
|
+
idToken: string;
|
|
26
|
+
accessToken: string;
|
|
27
|
+
refreshToken: string;
|
|
28
|
+
};
|
|
29
|
+
}): string[];
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCookies = exports.extractAndParseCookies = void 0;
|
|
4
|
+
const cookie_1 = require("cookie");
|
|
5
|
+
const jwt_1 = require("./jwt");
|
|
6
|
+
/**
|
|
7
|
+
* Cookies are present in the HTTP header "Cookie" that may be present
|
|
8
|
+
* multiple times. This utility function parses occurrences of that
|
|
9
|
+
* header and splits out all the cookies and their values.
|
|
10
|
+
* A simple object is returned that allows easy access by cookie
|
|
11
|
+
* name: e.g. cookies["nonce"].
|
|
12
|
+
*/
|
|
13
|
+
function extractCookiesFromHeaders(headers) {
|
|
14
|
+
if (!headers["cookie"]) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const cookies = headers["cookie"].reduce((reduced, header) => ({
|
|
18
|
+
...reduced,
|
|
19
|
+
...(0, cookie_1.parse)(header.value),
|
|
20
|
+
}), {});
|
|
21
|
+
return cookies;
|
|
22
|
+
}
|
|
23
|
+
function withCookieDomain(distributionDomainName, cookieSettings) {
|
|
24
|
+
if (cookieSettings.toLowerCase().indexOf("domain") === -1) {
|
|
25
|
+
// Add leading dot for compatibility with Amplify (or js-cookie really).
|
|
26
|
+
return `${cookieSettings}; Domain=.${distributionDomainName}`;
|
|
27
|
+
}
|
|
28
|
+
return cookieSettings;
|
|
29
|
+
}
|
|
30
|
+
function extractAndParseCookies(headers, clientId) {
|
|
31
|
+
const cookies = extractCookiesFromHeaders(headers);
|
|
32
|
+
if (!cookies) {
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
const keyPrefix = `CognitoIdentityServiceProvider.${clientId}`;
|
|
36
|
+
const tokenUserName = cookies[`${keyPrefix}.LastAuthUser`];
|
|
37
|
+
return {
|
|
38
|
+
tokenUserName,
|
|
39
|
+
idToken: cookies[`${keyPrefix}.${tokenUserName !== null && tokenUserName !== void 0 ? tokenUserName : ""}.idToken`],
|
|
40
|
+
accessToken: cookies[`${keyPrefix}.${tokenUserName !== null && tokenUserName !== void 0 ? tokenUserName : ""}.accessToken`],
|
|
41
|
+
refreshToken: cookies[`${keyPrefix}.${tokenUserName !== null && tokenUserName !== void 0 ? tokenUserName : ""}.refreshToken`],
|
|
42
|
+
scopes: cookies[`${keyPrefix}.${tokenUserName !== null && tokenUserName !== void 0 ? tokenUserName : ""}.tokenScopesString`],
|
|
43
|
+
nonce: cookies["spa-auth-edge-nonce"],
|
|
44
|
+
nonceHmac: cookies["spa-auth-edge-nonce-hmac"],
|
|
45
|
+
pkce: cookies["spa-auth-edge-pkce"],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
exports.extractAndParseCookies = extractAndParseCookies;
|
|
49
|
+
function generateCookies(param) {
|
|
50
|
+
// Set cookies with the exact names and values Amplify uses
|
|
51
|
+
// for seamless interoperability with Amplify.
|
|
52
|
+
const decodedIdToken = (0, jwt_1.decodeIdToken)(param.tokens.idToken);
|
|
53
|
+
const tokenUserName = decodedIdToken["cognito:username"];
|
|
54
|
+
const keyPrefix = `CognitoIdentityServiceProvider.${param.clientId}`;
|
|
55
|
+
const idTokenKey = `${keyPrefix}.${tokenUserName}.idToken`;
|
|
56
|
+
const accessTokenKey = `${keyPrefix}.${tokenUserName}.accessToken`;
|
|
57
|
+
const refreshTokenKey = `${keyPrefix}.${tokenUserName}.refreshToken`;
|
|
58
|
+
const lastUserKey = `${keyPrefix}.LastAuthUser`;
|
|
59
|
+
const scopeKey = `${keyPrefix}.${tokenUserName}.tokenScopesString`;
|
|
60
|
+
const scopesString = param.oauthScopes.join(" ");
|
|
61
|
+
const userDataKey = `${keyPrefix}.${tokenUserName}.userData`;
|
|
62
|
+
const userData = JSON.stringify({
|
|
63
|
+
UserAttributes: [
|
|
64
|
+
{
|
|
65
|
+
Name: "sub",
|
|
66
|
+
Value: decodedIdToken["sub"],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
Name: "email",
|
|
70
|
+
Value: decodedIdToken["email"],
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
Username: tokenUserName,
|
|
74
|
+
});
|
|
75
|
+
// Construct object with the cookies
|
|
76
|
+
const cookies = {
|
|
77
|
+
[idTokenKey]: `${param.tokens.idToken}; ${withCookieDomain(param.domainName, param.cookieSettings.idToken)}`,
|
|
78
|
+
[accessTokenKey]: `${param.tokens.accessToken}; ${withCookieDomain(param.domainName, param.cookieSettings.accessToken)}`,
|
|
79
|
+
[refreshTokenKey]: `${param.tokens.refreshToken}; ${withCookieDomain(param.domainName, param.cookieSettings.refreshToken)}`,
|
|
80
|
+
[lastUserKey]: `${tokenUserName}; ${withCookieDomain(param.domainName, param.cookieSettings.idToken)}`,
|
|
81
|
+
[scopeKey]: `${scopesString}; ${withCookieDomain(param.domainName, param.cookieSettings.accessToken)}`,
|
|
82
|
+
[userDataKey]: `${encodeURIComponent(userData)}; ${withCookieDomain(param.domainName, param.cookieSettings.idToken)}`,
|
|
83
|
+
"amplify-signin-with-hostedUI": `true; ${withCookieDomain(param.domainName, param.cookieSettings.accessToken)}`,
|
|
84
|
+
};
|
|
85
|
+
if (param.event === "signOut") {
|
|
86
|
+
// Expire all cookies
|
|
87
|
+
Object.keys(cookies).forEach((key) => (cookies[key] = expireCookie(cookies[key])));
|
|
88
|
+
}
|
|
89
|
+
else if (param.event === "refreshFailed") {
|
|
90
|
+
// Expire refresh token (so the browser will not send it in vain again)
|
|
91
|
+
cookies[refreshTokenKey] = expireCookie(cookies[refreshTokenKey]);
|
|
92
|
+
}
|
|
93
|
+
// Nonce, nonceHmac and pkce are only used during login phase.
|
|
94
|
+
;
|
|
95
|
+
[
|
|
96
|
+
"spa-auth-edge-nonce",
|
|
97
|
+
"spa-auth-edge-nonce-hmac",
|
|
98
|
+
"spa-auth-edge-pkce",
|
|
99
|
+
].forEach((key) => {
|
|
100
|
+
cookies[key] = expireCookie(cookies[key]);
|
|
101
|
+
});
|
|
102
|
+
return Object.entries(cookies).map(([k, v]) => `${k}=${v}`);
|
|
103
|
+
}
|
|
104
|
+
exports.generateCookies = generateCookies;
|
|
105
|
+
function expireCookie(cookie = "") {
|
|
106
|
+
const cookieParts = cookie
|
|
107
|
+
.split(";")
|
|
108
|
+
.map((part) => part.trim())
|
|
109
|
+
.filter((part) => !part.toLowerCase().startsWith("max-age"))
|
|
110
|
+
.filter((part) => !part.toLowerCase().startsWith("expires"));
|
|
111
|
+
const expires = `Expires=${new Date(0).toUTCString()}`;
|
|
112
|
+
// First part is the cookie value, which we'll clear.
|
|
113
|
+
return ["", ...cookieParts.slice(1), expires].join("; ");
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy91dGlsL2Nvb2tpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQThCO0FBQzlCLCtCQUFxQztBQVdyQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLE9BQTBCO0lBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxFQUFFLENBQUE7S0FDVjtJQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQ3RDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQixHQUFHLE9BQU87UUFDVixHQUFJLElBQUEsY0FBSyxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQWE7S0FDcEMsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFBO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLHNCQUE4QixFQUM5QixjQUFzQjtJQUV0QixJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDekQsd0VBQXdFO1FBQ3hFLE9BQU8sR0FBRyxjQUFjLGFBQWEsc0JBQXNCLEVBQUUsQ0FBQTtLQUM5RDtJQUNELE9BQU8sY0FBYyxDQUFBO0FBQ3ZCLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMsT0FBMEIsRUFDMUIsUUFBZ0I7SUFXaEIsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU8sRUFBRSxDQUFBO0tBQ1Y7SUFFRCxNQUFNLFNBQVMsR0FBRyxrQ0FBa0MsUUFBUSxFQUFFLENBQUE7SUFDOUQsTUFBTSxhQUFhLEdBQUcsT0FB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T0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMzQyxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUM3RCxDQUFDO0FBMUZELDBDQTBGQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFO0lBQy9CLE1BQU0sV0FBVyxHQUFHLE1BQU07U0FDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDOUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFBO0lBQ3RELHFEQUFxRDtJQUNyRCxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsb3VkRnJvbnRIZWFkZXJzIH0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiY29va2llXCJcbmltcG9ydCB7IGRlY29kZUlkVG9rZW4gfSBmcm9tIFwiLi9qd3RcIlxuXG50eXBlIENvb2tpZXMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29va2llU2V0dGluZ3Mge1xuICBpZFRva2VuOiBzdHJpbmdcbiAgYWNjZXNzVG9rZW46IHN0cmluZ1xuICByZWZyZXNoVG9rZW46IHN0cmluZ1xuICBub25jZTogc3RyaW5nXG59XG5cbi8qKlxuICogQ29va2llcyBhcmUgcHJlc2VudCBpbiB0aGUgSFRUUCBoZWFkZXIgXCJDb29raWVcIiB0aGF0IG1heSBiZSBwcmVzZW50XG4gKiBtdWx0aXBsZSB0aW1lcy4gVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHBhcnNlcyBvY2N1cnJlbmNlcyAgb2YgdGhhdFxuICogaGVhZGVyIGFuZCBzcGxpdHMgb3V0IGFsbCB0aGUgY29va2llcyBhbmQgdGhlaXIgdmFsdWVzLlxuICogQSBzaW1wbGUgb2JqZWN0IGlzIHJldHVybmVkIHRoYXQgYWxsb3dzIGVhc3kgYWNjZXNzIGJ5IGNvb2tpZVxuICogbmFtZTogZS5nLiBjb29raWVzW1wibm9uY2VcIl0uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb29raWVzRnJvbUhlYWRlcnMoaGVhZGVyczogQ2xvdWRGcm9udEhlYWRlcnMpOiBDb29raWVzIHtcbiAgaWYgKCFoZWFkZXJzW1wiY29va2llXCJdKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbiAgY29uc3QgY29va2llcyA9IGhlYWRlcnNbXCJjb29raWVcIl0ucmVkdWNlPENvb2tpZXM+KFxuICAgIChyZWR1Y2VkLCBoZWFkZXIpID0+ICh7XG4gICAgICAuLi5yZWR1Y2VkLFxuICAgICAgLi4uKHBhcnNlKGhlYWRlci52YWx1ZSkgYXMgQ29va2llcyksXG4gICAgfSksXG4gICAge30sXG4gIClcblxuICByZXR1cm4gY29va2llc1xufVxuXG5mdW5jdGlvbiB3aXRoQ29va2llRG9tYWluKFxuICBkaXN0cmlidXRpb25Eb21haW5OYW1lOiBzdHJpbmcsXG4gIGNvb2tpZVNldHRpbmdzOiBzdHJpbmcsXG4pIHtcbiAgaWYgKGNvb2tpZVNldHRpbmdzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImRvbWFpblwiKSA9PT0gLTEpIHtcbiAgICAvLyBBZGQgbGVhZGluZyBkb3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBbXBsaWZ5IChvciBqcy1jb29raWUgcmVhbGx5KS5cbiAgICByZXR1cm4gYCR7Y29va2llU2V0dGluZ3N9OyBEb21haW49LiR7ZGlzdHJpYnV0aW9uRG9tYWluTmFtZX1gXG4gIH1cbiAgcmV0dXJuIGNvb2tpZVNldHRpbmdzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0QW5kUGFyc2VDb29raWVzKFxuICBoZWFkZXJzOiBDbG91ZEZyb250SGVhZGVycyxcbiAgY2xpZW50SWQ6IHN0cmluZyxcbik6IHtcbiAgdG9rZW5Vc2VyTmFtZT86IHN0cmluZ1xuICBpZFRva2VuPzogc3RyaW5nXG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nXG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZ1xuICBzY29wZXM/OiBzdHJpbmdcbiAgbm9uY2U/OiBzdHJpbmdcbiAgbm9uY2VIbWFjPzogc3RyaW5nXG4gIHBrY2U/OiBzdHJpbmdcbn0ge1xuICBjb25zdCBjb29raWVzID0gZXh0cmFjdENvb2tpZXNGcm9tSGVhZGVycyhoZWFkZXJzKVxuICBpZiAoIWNvb2tpZXMpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGNvbnN0IGtleVByZWZpeCA9IGBDb2duaXRvSWRlbnRpdHlTZXJ2aWNlUHJvdmlkZXIuJHtjbGllbnRJZH1gXG4gIGNvbnN0IHRva2VuVXNlck5hbWUgPSBjb29raWVzW2Ake2tleVByZWZpeH0uTGFzdEF1dGhVc2VyYF1cblxuICByZXR1cm4ge1xuICAgIHRva2VuVXNlck5hbWUsXG4gICAgaWRUb2tlbjogY29va2llc1tgJHtrZXlQcmVmaXh9LiR7dG9rZW5Vc2VyTmFtZSA/PyBcIlwifS5pZFRva2VuYF0sXG4gICAgYWNjZXNzVG9rZW46IGNvb2tpZXNbYCR7a2V5UHJlZml4fS4ke3Rva2VuVXNlck5hbWUgPz8gXCJcIn0uYWNjZXNzVG9rZW5gXSxcbiAgICByZWZyZXNoVG9rZW46IGNvb2tpZXNbYCR7a2V5UHJlZml4fS4ke3Rva2VuVXNlck5hbWUgPz8gXCJcIn0ucmVmcmVzaFRva2VuYF0sXG4gICAgc2NvcGVzOiBjb29raWVzW2Ake2tleVByZWZpeH0uJHt0b2tlblVzZXJOYW1lID8/IFwiXCJ9LnRva2VuU2NvcGVzU3RyaW5nYF0sXG4gICAgbm9uY2U6IGNvb2tpZXNbXCJzcGEtYXV0aC1lZGdlLW5vbmNlXCJdLFxuICAgIG5vbmNlSG1hYzogY29va2llc1tcInNwYS1hdXRoLWVkZ2Utbm9uY2UtaG1hY1wiXSxcbiAgICBwa2NlOiBjb29raWVzW1wic3BhLWF1dGgtZWRnZS1wa2NlXCJdLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvb2tpZXMocGFyYW06IHtcbiAgZXZlbnQ6IFwibmV3VG9rZW5zXCIgfCBcInNpZ25PdXRcIiB8IFwicmVmcmVzaEZhaWxlZFwiXG4gIGNsaWVudElkOiBzdHJpbmdcbiAgb2F1dGhTY29wZXM6IHN0cmluZ1tdXG4gIGRvbWFpbk5hbWU6IHN0cmluZ1xuICBjb29raWVTZXR0aW5nczogQ29va2llU2V0dGluZ3NcbiAgdG9rZW5zOiB7XG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZ1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nXG4gIH1cbn0pOiBzdHJpbmdbXSB7XG4gIC8vIFNldCBjb29raWVzIHdpdGggdGhlIGV4YWN0IG5hbWVzIGFuZCB2YWx1ZXMgQW1wbGlmeSB1c2VzXG4gIC8vIGZvciBzZWFtbGVzcyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggQW1wbGlmeS5cbiAgY29uc3QgZGVjb2RlZElkVG9rZW4gPSBkZWNvZGVJZFRva2VuKHBhcmFtLnRva2Vucy5pZFRva2VuKVxuICBjb25zdCB0b2tlblVzZXJOYW1lID0gZGVjb2RlZElkVG9rZW5bXCJjb2duaXRvOnVzZXJuYW1lXCJdIGFzIHN0cmluZ1xuICBjb25zdCBrZXlQcmVmaXggPSBgQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyLiR7cGFyYW0uY2xpZW50SWR9YFxuICBjb25zdCBpZFRva2VuS2V5ID0gYCR7a2V5UHJlZml4fS4ke3Rva2VuVXNlck5hbWV9LmlkVG9rZW5gXG4gIGNvbnN0IGFjY2Vzc1Rva2VuS2V5ID0gYCR7a2V5UHJlZml4fS4ke3Rva2VuVXNlck5hbWV9LmFjY2Vzc1Rva2VuYFxuICBjb25zdCByZWZyZXNoVG9rZW5LZXkgPSBgJHtrZXlQcmVmaXh9LiR7dG9rZW5Vc2VyTmFtZX0ucmVmcmVzaFRva2VuYFxuICBjb25zdCBsYXN0VXNlcktleSA9IGAke2tleVByZWZpeH0uTGFzdEF1dGhVc2VyYFxuICBjb25zdCBzY29wZUtleSA9IGAke2tleVByZWZpeH0uJHt0b2tlblVzZXJOYW1lfS50b2tlblNjb3Blc1N0cmluZ2BcbiAgY29uc3Qgc2NvcGVzU3RyaW5nID0gcGFyYW0ub2F1dGhTY29wZXMuam9pbihcIiBcIilcbiAgY29uc3QgdXNlckRhdGFLZXkgPSBgJHtrZXlQcmVmaXh9LiR7dG9rZW5Vc2VyTmFtZX0udXNlckRhdGFgXG4gIGNvbnN0IHVzZXJEYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIFVzZXJBdHRyaWJ1dGVzOiBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwic3ViXCIsXG4gICAgICAgIFZhbHVlOiBkZWNvZGVkSWRUb2tlbltcInN1YlwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiZW1haWxcIixcbiAgICAgICAgVmFsdWU6IGRlY29kZWRJZFRva2VuW1wiZW1haWxcIl0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgVXNlcm5hbWU6IHRva2VuVXNlck5hbWUsXG4gIH0pXG5cbiAgLy8gQ29uc3RydWN0IG9iamVjdCB3aXRoIHRoZSBjb29raWVzXG4gIGNvbnN0IGNvb2tpZXMgPSB7XG4gICAgW2lkVG9rZW5LZXldOiBgJHtwYXJhbS50b2tlbnMuaWRUb2tlbn07ICR7d2l0aENvb2tpZURvbWFpbihcbiAgICAgIHBhcmFtLmRvbWFpbk5hbWUsXG4gICAgICBwYXJhbS5jb29raWVTZXR0aW5ncy5pZFRva2VuLFxuICAgICl9YCxcbiAgICBbYWNjZXNzVG9rZW5LZXldOiBgJHtwYXJhbS50b2tlbnMuYWNjZXNzVG9rZW59OyAke3dpdGhDb29raWVEb21haW4oXG4gICAgICBwYXJhbS5kb21haW5OYW1lLFxuICAgICAgcGFyYW0uY29va2llU2V0dGluZ3MuYWNjZXNzVG9rZW4sXG4gICAgKX1gLFxuICAgIFtyZWZyZXNoVG9rZW5LZXldOiBgJHtwYXJhbS50b2tlbnMucmVmcmVzaFRva2VufTsgJHt3aXRoQ29va2llRG9tYWluKFxuICAgICAgcGFyYW0uZG9tYWluTmFtZSxcbiAgICAgIHBhcmFtLmNvb2tpZVNldHRpbmdzLnJlZnJlc2hUb2tlbixcbiAgICApfWAsXG4gICAgW2xhc3RVc2VyS2V5XTogYCR7dG9rZW5Vc2VyTmFtZX07ICR7d2l0aENvb2tpZURvbWFpbihcbiAgICAgIHBhcmFtLmRvbWFpbk5hbWUsXG4gICAgICBwYXJhbS5jb29raWVTZXR0aW5ncy5pZFRva2VuLFxuICAgICl9YCxcbiAgICBbc2NvcGVLZXldOiBgJHtzY29wZXNTdHJpbmd9OyAke3dpdGhDb29raWVEb21haW4oXG4gICAgICBwYXJhbS5kb21haW5OYW1lLFxuICAgICAgcGFyYW0uY29va2llU2V0dGluZ3MuYWNjZXNzVG9rZW4sXG4gICAgKX1gLFxuICAgIFt1c2VyRGF0YUtleV06IGAke2VuY29kZVVSSUNvbXBvbmVudCh1c2VyRGF0YSl9OyAke3dpdGhDb29raWVEb21haW4oXG4gICAgICBwYXJhbS5kb21haW5OYW1lLFxuICAgICAgcGFyYW0uY29va2llU2V0dGluZ3MuaWRUb2tlbixcbiAgICApfWAsXG4gICAgXCJhbXBsaWZ5LXNpZ25pbi13aXRoLWhvc3RlZFVJXCI6IGB0cnVlOyAke3dpdGhDb29raWVEb21haW4oXG4gICAgICBwYXJhbS5kb21haW5OYW1lLFxuICAgICAgcGFyYW0uY29va2llU2V0dGluZ3MuYWNjZXNzVG9rZW4sXG4gICAgKX1gLFxuICB9XG5cbiAgaWYgKHBhcmFtLmV2ZW50ID09PSBcInNpZ25PdXRcIikge1xuICAgIC8vIEV4cGlyZSBhbGwgY29va2llc1xuICAgIE9iamVjdC5rZXlzKGNvb2tpZXMpLmZvckVhY2goXG4gICAgICAoa2V5KSA9PiAoY29va2llc1trZXldID0gZXhwaXJlQ29va2llKGNvb2tpZXNba2V5XSkpLFxuICAgIClcbiAgfSBlbHNlIGlmIChwYXJhbS5ldmVudCA9PT0gXCJyZWZyZXNoRmFpbGVkXCIpIHtcbiAgICAvLyBFeHBpcmUgcmVmcmVzaCB0b2tlbiAoc28gdGhlIGJyb3dzZXIgd2lsbCBub3Qgc2VuZCBpdCBpbiB2YWluIGFnYWluKVxuICAgIGNvb2tpZXNbcmVmcmVzaFRva2VuS2V5XSA9IGV4cGlyZUNvb2tpZShjb29raWVzW3JlZnJlc2hUb2tlbktleV0pXG4gIH1cblxuICAvLyBOb25jZSwgbm9uY2VIbWFjIGFuZCBwa2NlIGFyZSBvbmx5IHVzZWQgZHVyaW5nIGxvZ2luIHBoYXNlLlxuICA7W1xuICAgIFwic3BhLWF1dGgtZWRnZS1ub25jZVwiLFxuICAgIFwic3BhLWF1dGgtZWRnZS1ub25jZS1obWFjXCIsXG4gICAgXCJzcGEtYXV0aC1lZGdlLXBrY2VcIixcbiAgXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb29raWVzW2tleV0gPSBleHBpcmVDb29raWUoY29va2llc1trZXldKVxuICB9KVxuXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhjb29raWVzKS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JHt2fWApXG59XG5cbmZ1bmN0aW9uIGV4cGlyZUNvb2tpZShjb29raWUgPSBcIlwiKSB7XG4gIGNvbnN0IGNvb2tpZVBhcnRzID0gY29va2llXG4gICAgLnNwbGl0KFwiO1wiKVxuICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgIC5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcIm1heC1hZ2VcIikpXG4gICAgLmZpbHRlcigocGFydCkgPT4gIXBhcnQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiZXhwaXJlc1wiKSlcbiAgY29uc3QgZXhwaXJlcyA9IGBFeHBpcmVzPSR7bmV3IERhdGUoMCkudG9VVENTdHJpbmcoKX1gXG4gIC8vIEZpcnN0IHBhcnQgaXMgdGhlIGNvb2tpZSB2YWx1ZSwgd2hpY2ggd2UnbGwgY2xlYXIuXG4gIHJldHVybiBbXCJcIiwgLi4uY29va2llUGFydHMuc2xpY2UoMSksIGV4cGlyZXNdLmpvaW4oXCI7IFwiKVxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface IdTokenPayload {
|
|
2
|
+
sub: string;
|
|
3
|
+
"cognito:groups"?: string[];
|
|
4
|
+
"cognito:username"?: string;
|
|
5
|
+
given_name?: string;
|
|
6
|
+
aud: string;
|
|
7
|
+
token_use: "id";
|
|
8
|
+
auth_time: number;
|
|
9
|
+
name?: string;
|
|
10
|
+
exp: number;
|
|
11
|
+
iat: number;
|
|
12
|
+
email?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function validate(jwtToken: string, jwksUri: string, issuer: string, audience: string): Promise<{
|
|
15
|
+
validationError: Error;
|
|
16
|
+
} | undefined>;
|
|
17
|
+
export declare function decodeIdToken(jwt: string): IdTokenPayload;
|