@simulacrum/auth0-simulator 0.11.2 → 0.11.4
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/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/_virtual/rolldown_runtime.mjs +7 -0
- package/dist/auth/constants.cjs +15 -0
- package/dist/auth/constants.mjs +14 -0
- package/dist/auth/constants.mjs.map +1 -0
- package/dist/auth/date.cjs +8 -0
- package/dist/auth/date.mjs +7 -0
- package/dist/auth/date.mjs.map +1 -0
- package/dist/auth/jwt.cjs +16 -0
- package/dist/auth/jwt.mjs +15 -0
- package/dist/auth/jwt.mjs.map +1 -0
- package/dist/auth/refresh-token.cjs +24 -0
- package/dist/auth/refresh-token.mjs +23 -0
- package/dist/auth/refresh-token.mjs.map +1 -0
- package/dist/config/get-config.cjs +39 -0
- package/dist/config/get-config.mjs +39 -0
- package/dist/config/get-config.mjs.map +1 -0
- package/dist/handlers/auth0-handlers.cjs +207 -0
- package/dist/handlers/auth0-handlers.mjs +207 -0
- package/dist/handlers/auth0-handlers.mjs.map +1 -0
- package/dist/handlers/index.cjs +29 -0
- package/dist/handlers/index.mjs +27 -0
- package/dist/handlers/index.mjs.map +1 -0
- package/dist/handlers/login-redirect.cjs +24 -0
- package/dist/handlers/login-redirect.mjs +24 -0
- package/dist/handlers/login-redirect.mjs.map +1 -0
- package/dist/handlers/oauth-handlers.cjs +144 -0
- package/dist/handlers/oauth-handlers.mjs +144 -0
- package/dist/handlers/oauth-handlers.mjs.map +1 -0
- package/dist/handlers/openid-handlers.cjs +32 -0
- package/dist/handlers/openid-handlers.mjs +33 -0
- package/dist/handlers/openid-handlers.mjs.map +1 -0
- package/dist/handlers/url.cjs +6 -0
- package/dist/handlers/url.mjs +6 -0
- package/dist/handlers/url.mjs.map +1 -0
- package/dist/handlers/utils.cjs +25 -0
- package/dist/handlers/utils.mjs +24 -0
- package/dist/handlers/utils.mjs.map +1 -0
- package/dist/handlers/web-message.cjs +23 -0
- package/dist/handlers/web-message.mjs +23 -0
- package/dist/handlers/web-message.mjs.map +1 -0
- package/dist/index.cjs +14 -38722
- package/dist/index.d.cts +4 -176
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +21 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/create-cors.cjs +15 -0
- package/dist/middleware/create-cors.mjs +14 -0
- package/dist/middleware/create-cors.mjs.map +1 -0
- package/dist/middleware/error-handling.cjs +25 -0
- package/dist/middleware/error-handling.mjs +25 -0
- package/dist/middleware/error-handling.mjs.map +1 -0
- package/dist/middleware/no-cache.cjs +10 -0
- package/dist/middleware/no-cache.mjs +10 -0
- package/dist/middleware/no-cache.mjs.map +1 -0
- package/dist/middleware/session.cjs +19 -0
- package/dist/middleware/session.mjs +18 -0
- package/dist/middleware/session.mjs.map +1 -0
- package/dist/rules/extensionless-file-name.cjs +6 -0
- package/dist/rules/extensionless-file-name.mjs +6 -0
- package/dist/rules/extensionless-file-name.mjs.map +1 -0
- package/dist/rules/parse-rules-files.cjs +28 -0
- package/dist/rules/parse-rules-files.mjs +26 -0
- package/dist/rules/parse-rules-files.mjs.map +1 -0
- package/dist/rules/rules-runner.cjs +67 -0
- package/dist/rules/rules-runner.mjs +65 -0
- package/dist/rules/rules-runner.mjs.map +1 -0
- package/dist/store/entities.cjs +36 -0
- package/dist/store/entities.d.cts +99 -0
- package/dist/store/entities.d.cts.map +1 -0
- package/dist/store/entities.d.mts +100 -0
- package/dist/store/entities.d.mts.map +1 -0
- package/dist/store/entities.mjs +33 -0
- package/dist/store/entities.mjs.map +1 -0
- package/dist/store/index.cjs +44 -0
- package/dist/store/index.d.cts +22 -0
- package/dist/store/index.d.cts.map +1 -0
- package/dist/store/index.d.mts +22 -0
- package/dist/store/index.d.mts.map +1 -0
- package/dist/store/index.mjs +45 -0
- package/dist/store/index.mjs.map +1 -0
- package/dist/types.cjs +24 -0
- package/dist/types.d.cts +66 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +66 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +24 -0
- package/dist/types.mjs.map +1 -0
- package/dist/views/login.cjs +145 -0
- package/dist/views/login.mjs +146 -0
- package/dist/views/login.mjs.map +1 -0
- package/dist/views/username-password.cjs +39 -0
- package/dist/views/username-password.mjs +39 -0
- package/dist/views/username-password.mjs.map +1 -0
- package/dist/views/web-message.cjs +66 -0
- package/dist/views/web-message.mjs +65 -0
- package/dist/views/web-message.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/index.d.ts +0 -193
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -38720
- package/dist/index.js.map +0 -1
- /package/dist/{public → views/public}/img/frontside-logo.png +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region rolldown:runtime
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
|
|
29
|
+
exports.__toESM = __toESM;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/auth/constants.ts
|
|
3
|
+
const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~";
|
|
4
|
+
const JWKS = { keys: [{
|
|
5
|
+
kty: "RSA",
|
|
6
|
+
n: "wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ",
|
|
7
|
+
e: "AQAB",
|
|
8
|
+
alg: "RS256",
|
|
9
|
+
kid: "NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA",
|
|
10
|
+
use: "sig"
|
|
11
|
+
}] };
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
exports.JWKS = JWKS;
|
|
15
|
+
exports.PRIVATE_KEY = PRIVATE_KEY;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/auth/constants.ts
|
|
2
|
+
const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~";
|
|
3
|
+
const JWKS = { keys: [{
|
|
4
|
+
kty: "RSA",
|
|
5
|
+
n: "wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ",
|
|
6
|
+
e: "AQAB",
|
|
7
|
+
alg: "RS256",
|
|
8
|
+
kid: "NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA",
|
|
9
|
+
use: "sig"
|
|
10
|
+
}] };
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { JWKS, PRIVATE_KEY };
|
|
14
|
+
//# sourceMappingURL=constants.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","names":[],"sources":["../../src/auth/constants.ts"],"sourcesContent":["export const PRIVATE_KEY =\n \"-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~\" as const;\n\nexport const JWKS = {\n keys: [\n {\n kty: \"RSA\",\n n: \"wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ\",\n e: \"AQAB\",\n alg: \"RS256\",\n kid: \"NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA\",\n use: \"sig\",\n },\n ],\n} as const;\n"],"mappings":";AAAA,MAAa,cACX;AAEF,MAAa,OAAO,EAClB,MAAM,CACJ;CACE,KAAK;CACL,GAAG;CACH,GAAG;CACH,KAAK;CACL,KAAK;CACL,KAAK;CACN,CACF,EACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.mjs","names":[],"sources":["../../src/auth/date.ts"],"sourcesContent":["export const epochTime = (date = Date.now()): number => Math.floor(date / 1000);\n\nexport const expiresAt = (hours = 1): number =>\n epochTime() + hours * 60 * 60 * 1000;\n\nexport const epochTimeToLocalDate = (epoch: number): Date => {\n let date = new Date(0);\n date.setUTCSeconds(epoch);\n return date;\n};\n"],"mappings":";AAAA,MAAa,aAAa,OAAO,KAAK,KAAK,KAAa,KAAK,MAAM,OAAO,IAAK;AAE/E,MAAa,aAAa,QAAQ,MAChC,WAAW,GAAG,QAAQ,KAAK,KAAK"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_constants = require('./constants.cjs');
|
|
3
|
+
let jsonwebtoken = require("jsonwebtoken");
|
|
4
|
+
jsonwebtoken = require_rolldown_runtime.__toESM(jsonwebtoken);
|
|
5
|
+
|
|
6
|
+
//#region src/auth/jwt.ts
|
|
7
|
+
const parseKey = (key) => key.split("~~").join("\n");
|
|
8
|
+
function createJsonWebToken(payload, privateKey = parseKey(require_constants.PRIVATE_KEY), options = {
|
|
9
|
+
algorithm: "RS256",
|
|
10
|
+
keyid: require_constants.JWKS.keys[0].kid
|
|
11
|
+
}) {
|
|
12
|
+
return jsonwebtoken.sign(payload, privateKey, options);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
exports.createJsonWebToken = createJsonWebToken;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { JWKS, PRIVATE_KEY } from "./constants.mjs";
|
|
2
|
+
import * as jwt from "jsonwebtoken";
|
|
3
|
+
|
|
4
|
+
//#region src/auth/jwt.ts
|
|
5
|
+
const parseKey = (key) => key.split("~~").join("\n");
|
|
6
|
+
function createJsonWebToken(payload, privateKey = parseKey(PRIVATE_KEY), options = {
|
|
7
|
+
algorithm: "RS256",
|
|
8
|
+
keyid: JWKS.keys[0].kid
|
|
9
|
+
}) {
|
|
10
|
+
return jwt.sign(payload, privateKey, options);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createJsonWebToken };
|
|
15
|
+
//# sourceMappingURL=jwt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.mjs","names":[],"sources":["../../src/auth/jwt.ts"],"sourcesContent":["import type { SignOptions } from \"jsonwebtoken\";\nimport * as jwt from \"jsonwebtoken\";\nimport { JWKS, PRIVATE_KEY } from \"./constants.ts\";\n\nexport const parseKey = (key: string): string => key.split(\"~~\").join(\"\\n\");\n\ntype SignPayload = Parameters<typeof jwt.sign>[0];\n\nexport function createJsonWebToken<P extends SignPayload>(\n payload: P,\n privateKey = parseKey(PRIVATE_KEY),\n options: SignOptions = {\n algorithm: \"RS256\",\n keyid: JWKS.keys[0].kid,\n }\n): string {\n return jwt.sign(payload, privateKey, options);\n}\n"],"mappings":";;;;AAIA,MAAa,YAAY,QAAwB,IAAI,MAAM,KAAK,CAAC,KAAK,KAAK;AAI3E,SAAgB,mBACd,SACA,aAAa,SAAS,YAAY,EAClC,UAAuB;CACrB,WAAW;CACX,OAAO,KAAK,KAAK,GAAG;CACrB,EACO;AACR,QAAO,IAAI,KAAK,SAAS,YAAY,QAAQ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_date = require('./date.cjs');
|
|
3
|
+
let assert_ts = require("assert-ts");
|
|
4
|
+
let base64_url = require("base64-url");
|
|
5
|
+
|
|
6
|
+
//#region src/auth/refresh-token.ts
|
|
7
|
+
function issueRefreshToken(scope, grantType) {
|
|
8
|
+
return grantType === "refresh_token" || scope.includes("offline_access");
|
|
9
|
+
}
|
|
10
|
+
function createRefreshToken({ exp, rotations = 0, scope, user, nonce }) {
|
|
11
|
+
(0, assert_ts.assert)(!!user.id, `no identifier for user`);
|
|
12
|
+
return (0, base64_url.encode)(JSON.stringify({
|
|
13
|
+
exp,
|
|
14
|
+
iat: require_date.epochTime(),
|
|
15
|
+
rotations,
|
|
16
|
+
scope,
|
|
17
|
+
user: { id: user.id },
|
|
18
|
+
nonce
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.createRefreshToken = createRefreshToken;
|
|
24
|
+
exports.issueRefreshToken = issueRefreshToken;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { epochTime } from "./date.mjs";
|
|
2
|
+
import { assert } from "assert-ts";
|
|
3
|
+
import { encode } from "base64-url";
|
|
4
|
+
|
|
5
|
+
//#region src/auth/refresh-token.ts
|
|
6
|
+
function issueRefreshToken(scope, grantType) {
|
|
7
|
+
return grantType === "refresh_token" || scope.includes("offline_access");
|
|
8
|
+
}
|
|
9
|
+
function createRefreshToken({ exp, rotations = 0, scope, user, nonce }) {
|
|
10
|
+
assert(!!user.id, `no identifier for user`);
|
|
11
|
+
return encode(JSON.stringify({
|
|
12
|
+
exp,
|
|
13
|
+
iat: epochTime(),
|
|
14
|
+
rotations,
|
|
15
|
+
scope,
|
|
16
|
+
user: { id: user.id },
|
|
17
|
+
nonce
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createRefreshToken, issueRefreshToken };
|
|
23
|
+
//# sourceMappingURL=refresh-token.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.mjs","names":[],"sources":["../../src/auth/refresh-token.ts"],"sourcesContent":["import type { GrantType, RefreshToken } from \"../types.ts\";\nimport { epochTime } from \"./date.ts\";\nimport { encode } from \"base64-url\";\nimport { assert } from \"assert-ts\";\n\nexport function issueRefreshToken(\n scope: string,\n grantType: GrantType\n): boolean {\n return grantType === \"refresh_token\" || scope.includes(\"offline_access\");\n}\n\nexport function createRefreshToken({\n exp,\n rotations = 0,\n scope,\n user,\n nonce,\n}: Omit<RefreshToken, \"iat\">): string {\n assert(!!user.id, `no identifier for user`);\n\n return encode(\n JSON.stringify({\n exp,\n iat: epochTime(),\n rotations,\n scope,\n user: { id: user.id },\n nonce,\n })\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,kBACd,OACA,WACS;AACT,QAAO,cAAc,mBAAmB,MAAM,SAAS,iBAAiB;;AAG1E,SAAgB,mBAAmB,EACjC,KACA,YAAY,GACZ,OACA,MACA,SACoC;AACpC,QAAO,CAAC,CAAC,KAAK,IAAI,yBAAyB;AAE3C,QAAO,OACL,KAAK,UAAU;EACb;EACA,KAAK,WAAW;EAChB;EACA;EACA,MAAM,EAAE,IAAI,KAAK,IAAI;EACrB;EACD,CAAC,CACH"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_types = require('../types.cjs');
|
|
3
|
+
let cosmiconfig = require("cosmiconfig");
|
|
4
|
+
|
|
5
|
+
//#region src/config/get-config.ts
|
|
6
|
+
const DefaultAuth0Port = 4400;
|
|
7
|
+
const DefaultArgs = {
|
|
8
|
+
clientID: "00000000000000000000000000000000",
|
|
9
|
+
audience: "https://thefrontside.auth0.com/api/v1/",
|
|
10
|
+
scope: "openid profile email offline_access"
|
|
11
|
+
};
|
|
12
|
+
function getPort({ domain, port }) {
|
|
13
|
+
if (typeof port === "number") return port;
|
|
14
|
+
if (domain) {
|
|
15
|
+
const parts = domain.split(":");
|
|
16
|
+
if (parts.length === 2) return parseInt(parts[1]);
|
|
17
|
+
}
|
|
18
|
+
return DefaultAuth0Port;
|
|
19
|
+
}
|
|
20
|
+
function getConfigCreator(explorer$1) {
|
|
21
|
+
return function getConfig$1(options) {
|
|
22
|
+
let searchResult = explorer$1.search();
|
|
23
|
+
let config = searchResult === null ? DefaultArgs : searchResult.config;
|
|
24
|
+
let strippedOptions = options ?? {};
|
|
25
|
+
let configuration = {
|
|
26
|
+
...DefaultArgs,
|
|
27
|
+
...config,
|
|
28
|
+
...strippedOptions
|
|
29
|
+
};
|
|
30
|
+
configuration.port = getPort(configuration);
|
|
31
|
+
require_types.configurationSchema.parse(configuration);
|
|
32
|
+
return configuration;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const explorer = (0, cosmiconfig.cosmiconfigSync)("auth0Simulator");
|
|
36
|
+
const getConfig = getConfigCreator(explorer);
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
exports.getConfig = getConfig;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { configurationSchema } from "../types.mjs";
|
|
2
|
+
import { cosmiconfigSync } from "cosmiconfig";
|
|
3
|
+
|
|
4
|
+
//#region src/config/get-config.ts
|
|
5
|
+
const DefaultAuth0Port = 4400;
|
|
6
|
+
const DefaultArgs = {
|
|
7
|
+
clientID: "00000000000000000000000000000000",
|
|
8
|
+
audience: "https://thefrontside.auth0.com/api/v1/",
|
|
9
|
+
scope: "openid profile email offline_access"
|
|
10
|
+
};
|
|
11
|
+
function getPort({ domain, port }) {
|
|
12
|
+
if (typeof port === "number") return port;
|
|
13
|
+
if (domain) {
|
|
14
|
+
const parts = domain.split(":");
|
|
15
|
+
if (parts.length === 2) return parseInt(parts[1]);
|
|
16
|
+
}
|
|
17
|
+
return DefaultAuth0Port;
|
|
18
|
+
}
|
|
19
|
+
function getConfigCreator(explorer$1) {
|
|
20
|
+
return function getConfig$1(options) {
|
|
21
|
+
let searchResult = explorer$1.search();
|
|
22
|
+
let config = searchResult === null ? DefaultArgs : searchResult.config;
|
|
23
|
+
let strippedOptions = options ?? {};
|
|
24
|
+
let configuration = {
|
|
25
|
+
...DefaultArgs,
|
|
26
|
+
...config,
|
|
27
|
+
...strippedOptions
|
|
28
|
+
};
|
|
29
|
+
configuration.port = getPort(configuration);
|
|
30
|
+
configurationSchema.parse(configuration);
|
|
31
|
+
return configuration;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const explorer = cosmiconfigSync("auth0Simulator");
|
|
35
|
+
const getConfig = getConfigCreator(explorer);
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { getConfig };
|
|
39
|
+
//# sourceMappingURL=get-config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-config.mjs","names":["DefaultArgs: ConfigSchema","getConfig","explorer","config: ConfigSchema"],"sources":["../../src/config/get-config.ts"],"sourcesContent":["import { cosmiconfigSync } from \"cosmiconfig\";\nimport type { Auth0Configuration, ConfigSchema } from \"../types.ts\";\nimport { configurationSchema } from \"../types.ts\";\n\nconst DefaultAuth0Port = 4400;\n\nexport const DefaultArgs: ConfigSchema = {\n clientID: \"00000000000000000000000000000000\",\n audience: \"https://thefrontside.auth0.com/api/v1/\",\n scope: \"openid profile email offline_access\",\n};\n\ntype Explorer = ReturnType<typeof cosmiconfigSync>;\n\nfunction getPort({ domain, port }: Auth0Configuration): number {\n if (typeof port === \"number\") {\n return port;\n }\n\n if (domain) {\n const parts = domain.split(\":\");\n if (parts.length === 2) {\n return parseInt(parts[1]!);\n }\n }\n\n return DefaultAuth0Port;\n}\n\n// This higher order function would only be used for testing and\n// allows different cosmiconfig instances to be used for testing\nexport function getConfigCreator(explorer: Explorer) {\n return function getConfig(\n options?: Partial<Auth0Configuration>\n ): Auth0Configuration {\n let searchResult = explorer.search();\n\n let config: ConfigSchema =\n searchResult === null ? DefaultArgs : searchResult.config;\n\n let strippedOptions = options ?? {};\n\n let configuration = {\n ...DefaultArgs,\n ...config,\n ...strippedOptions,\n } as Auth0Configuration;\n\n configuration.port = getPort(configuration);\n\n configurationSchema.parse(configuration);\n\n return configuration;\n };\n}\n\nconst explorer = cosmiconfigSync(\"auth0Simulator\");\n\nexport const getConfig = getConfigCreator(explorer);\n"],"mappings":";;;;AAIA,MAAM,mBAAmB;AAEzB,MAAaA,cAA4B;CACvC,UAAU;CACV,UAAU;CACV,OAAO;CACR;AAID,SAAS,QAAQ,EAAE,QAAQ,QAAoC;AAC7D,KAAI,OAAO,SAAS,SAClB,QAAO;AAGT,KAAI,QAAQ;EACV,MAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,MAAI,MAAM,WAAW,EACnB,QAAO,SAAS,MAAM,GAAI;;AAI9B,QAAO;;AAKT,SAAgB,iBAAiB,YAAoB;AACnD,QAAO,SAASC,YACd,SACoB;EACpB,IAAI,eAAeC,WAAS,QAAQ;EAEpC,IAAIC,SACF,iBAAiB,OAAO,cAAc,aAAa;EAErD,IAAI,kBAAkB,WAAW,EAAE;EAEnC,IAAI,gBAAgB;GAClB,GAAG;GACH,GAAG;GACH,GAAG;GACJ;AAED,gBAAc,OAAO,QAAQ,cAAc;AAE3C,sBAAoB,MAAM,cAAc;AAExC,SAAO;;;AAIX,MAAM,WAAW,gBAAgB,iBAAiB;AAElD,MAAa,YAAY,iBAAiB,SAAS"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_login_redirect = require('./login-redirect.cjs');
|
|
3
|
+
const require_web_message = require('./web-message.cjs');
|
|
4
|
+
const require_utils = require('./utils.cjs');
|
|
5
|
+
const require_login = require('../views/login.cjs');
|
|
6
|
+
const require_oauth_handlers = require('./oauth-handlers.cjs');
|
|
7
|
+
const require_username_password = require('../views/username-password.cjs');
|
|
8
|
+
let querystring = require("querystring");
|
|
9
|
+
let assert_ts = require("assert-ts");
|
|
10
|
+
let base64_url = require("base64-url");
|
|
11
|
+
let jsonwebtoken = require("jsonwebtoken");
|
|
12
|
+
|
|
13
|
+
//#region src/handlers/auth0-handlers.ts
|
|
14
|
+
const createLogger = (debug) => ({ log: (...args) => {
|
|
15
|
+
if (!debug) return;
|
|
16
|
+
console.dir(...args);
|
|
17
|
+
} });
|
|
18
|
+
const createAuth0Handlers = (simulationStore, serviceURL, options, debug) => {
|
|
19
|
+
let { audience, scope, clientID, rulesDirectory } = options;
|
|
20
|
+
let personQuery = require_utils.createPersonQuery(simulationStore);
|
|
21
|
+
let authorizeHandlers = {
|
|
22
|
+
query: require_login_redirect.createLoginRedirectHandler(options),
|
|
23
|
+
web_message: require_web_message.createWebMessageHandler()
|
|
24
|
+
};
|
|
25
|
+
let logger = createLogger(debug);
|
|
26
|
+
return {
|
|
27
|
+
["/heartbeat"]: function(_, res) {
|
|
28
|
+
res.status(200).json({ ok: true });
|
|
29
|
+
},
|
|
30
|
+
["/authorize"]: function(req, res, next) {
|
|
31
|
+
logger.log({ "/authorize": {
|
|
32
|
+
body: req.body,
|
|
33
|
+
query: req.query,
|
|
34
|
+
session: req.session
|
|
35
|
+
} });
|
|
36
|
+
let currentUser = req.query.currentUser;
|
|
37
|
+
(0, assert_ts.assert)(!!req.session, "no session");
|
|
38
|
+
if (currentUser) req.session.username = currentUser;
|
|
39
|
+
let responseMode = req.query.response_mode ?? "query";
|
|
40
|
+
(0, assert_ts.assert)(["query", "web_message"].includes(responseMode), `unknown response_mode ${responseMode}`);
|
|
41
|
+
let handler = authorizeHandlers[responseMode];
|
|
42
|
+
handler(req, res, next);
|
|
43
|
+
},
|
|
44
|
+
["/login"]: function(req, res) {
|
|
45
|
+
logger.log({ "/login": {
|
|
46
|
+
body: req.body,
|
|
47
|
+
query: req.query
|
|
48
|
+
} });
|
|
49
|
+
let query = req.query;
|
|
50
|
+
let responseClientId = query.client_id ?? clientID;
|
|
51
|
+
let responseAudience = query.audience ?? audience;
|
|
52
|
+
(0, assert_ts.assert)(!!responseClientId, `no clientID assigned`);
|
|
53
|
+
let html = require_login.loginView({
|
|
54
|
+
domain: new URL(serviceURL(req)).host,
|
|
55
|
+
scope,
|
|
56
|
+
redirectUri: query.redirect_uri,
|
|
57
|
+
clientID: responseClientId,
|
|
58
|
+
audience: responseAudience,
|
|
59
|
+
loginFailed: false
|
|
60
|
+
});
|
|
61
|
+
res.set("Content-Type", "text/html");
|
|
62
|
+
res.status(200).send(Buffer.from(html));
|
|
63
|
+
},
|
|
64
|
+
["/usernamepassword/login"]: function(req, res) {
|
|
65
|
+
logger.log({ "/usernamepassword/login": {
|
|
66
|
+
body: req.body,
|
|
67
|
+
query: req.query
|
|
68
|
+
} });
|
|
69
|
+
let { username, nonce, password } = req.body;
|
|
70
|
+
(0, assert_ts.assert)(!!username, "no username in /usernamepassword/login");
|
|
71
|
+
(0, assert_ts.assert)(!!nonce, "no nonce in /usernamepassword/login");
|
|
72
|
+
(0, assert_ts.assert)(!!req.session, "no session");
|
|
73
|
+
if (!personQuery((person) => person.email?.toLowerCase() === username.toLowerCase() && person.password === password)) {
|
|
74
|
+
let query = req.query;
|
|
75
|
+
let responseClientId = query.client_id ?? clientID;
|
|
76
|
+
let responseAudience = query.audience ?? audience;
|
|
77
|
+
(0, assert_ts.assert)(!!clientID, `no clientID assigned`);
|
|
78
|
+
let html = require_login.loginView({
|
|
79
|
+
domain: new URL(serviceURL(req)).host,
|
|
80
|
+
scope,
|
|
81
|
+
redirectUri: query.redirect_uri,
|
|
82
|
+
clientID: responseClientId,
|
|
83
|
+
audience: responseAudience,
|
|
84
|
+
loginFailed: true
|
|
85
|
+
});
|
|
86
|
+
res.set("Content-Type", "text/html");
|
|
87
|
+
res.status(400).send(html);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
req.session.username = username;
|
|
91
|
+
simulationStore.store.dispatch(simulationStore.actions.batchUpdater([simulationStore.schema.sessions.patch({ [nonce]: {
|
|
92
|
+
username,
|
|
93
|
+
nonce
|
|
94
|
+
} })]));
|
|
95
|
+
res.status(200).send(require_username_password.userNamePasswordForm(req.body));
|
|
96
|
+
},
|
|
97
|
+
["/login/callback"]: function(req, res) {
|
|
98
|
+
let wctx = JSON.parse(req.body.wctx);
|
|
99
|
+
logger.log({ "/login/callback": {
|
|
100
|
+
body: req.body,
|
|
101
|
+
query: req.query,
|
|
102
|
+
wctx
|
|
103
|
+
} });
|
|
104
|
+
let { redirect_uri, nonce } = wctx;
|
|
105
|
+
const { username } = simulationStore.schema.sessions.selectById(simulationStore.store.getState(), { id: nonce }) ?? {};
|
|
106
|
+
let routerUrl = `${redirect_uri}?${(0, querystring.stringify)({
|
|
107
|
+
code: (0, base64_url.encode)(`${nonce}:${username}`),
|
|
108
|
+
...wctx
|
|
109
|
+
})}`;
|
|
110
|
+
res.redirect(302, routerUrl);
|
|
111
|
+
},
|
|
112
|
+
["/oauth/token"]: async function(req, res, next) {
|
|
113
|
+
logger.log({ "/oauth/token": {
|
|
114
|
+
body: req.body,
|
|
115
|
+
query: req.query
|
|
116
|
+
} });
|
|
117
|
+
try {
|
|
118
|
+
let iss = serviceURL(req);
|
|
119
|
+
let responseClientId = req?.body?.client_id ?? clientID;
|
|
120
|
+
let responseAudience = req?.body?.audience ?? audience;
|
|
121
|
+
(0, assert_ts.assert)(!!responseClientId, "500::no clientID in options or request body");
|
|
122
|
+
let tokens = await require_oauth_handlers.createTokens({
|
|
123
|
+
simulationStore,
|
|
124
|
+
body: req.body,
|
|
125
|
+
iss,
|
|
126
|
+
clientID: responseClientId,
|
|
127
|
+
audience: responseAudience,
|
|
128
|
+
rulesDirectory,
|
|
129
|
+
scope
|
|
130
|
+
});
|
|
131
|
+
res.status(200).json({
|
|
132
|
+
...tokens,
|
|
133
|
+
expires_in: 86400,
|
|
134
|
+
token_type: "Bearer"
|
|
135
|
+
});
|
|
136
|
+
} catch (error) {
|
|
137
|
+
next(error);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
["/v2/logout"]: function(req, res) {
|
|
141
|
+
req.session = null;
|
|
142
|
+
let returnToUrl = req.query.returnTo ?? req.headers.referer;
|
|
143
|
+
(0, assert_ts.assert)(typeof returnToUrl === "string", `no logical returnTo url`);
|
|
144
|
+
res.redirect(returnToUrl);
|
|
145
|
+
},
|
|
146
|
+
["/userinfo"]: function(req, res) {
|
|
147
|
+
let token = null;
|
|
148
|
+
if (req.headers.authorization) token = req.headers.authorization?.split(" ")?.[1];
|
|
149
|
+
else token = req?.query?.access_token;
|
|
150
|
+
(0, assert_ts.assert)(!!token, "no authorization header or access_token");
|
|
151
|
+
let { sub } = (0, jsonwebtoken.decode)(token, { json: true });
|
|
152
|
+
let user = personQuery((person) => {
|
|
153
|
+
(0, assert_ts.assert)(!!person.id, `no email defined on person scenario`);
|
|
154
|
+
return person.id === sub;
|
|
155
|
+
});
|
|
156
|
+
(0, assert_ts.assert)(!!user, "no user in /userinfo");
|
|
157
|
+
let userinfo = {
|
|
158
|
+
sub,
|
|
159
|
+
name: user.name,
|
|
160
|
+
given_name: user.name,
|
|
161
|
+
family_name: user.name,
|
|
162
|
+
email: user.email,
|
|
163
|
+
email_verified: true,
|
|
164
|
+
locale: "en",
|
|
165
|
+
hd: "okta.com"
|
|
166
|
+
};
|
|
167
|
+
res.status(200).json(userinfo);
|
|
168
|
+
},
|
|
169
|
+
["/passwordless/start"]: function(req, res, next) {
|
|
170
|
+
logger.log({ "/passwordless/start": { body: req.body } });
|
|
171
|
+
try {
|
|
172
|
+
const { client_id, connection, email, phone_number } = req.body;
|
|
173
|
+
if (!client_id) {
|
|
174
|
+
res.status(400).json({ error: "client_id is required" });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!connection || connection !== "email" && connection !== "sms") {
|
|
178
|
+
res.status(400).json({ error: "connection must be 'email' or 'sms'" });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (connection === "email" && !email) {
|
|
182
|
+
res.status(400).json({ error: "email is required when connection is 'email'" });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (connection === "sms" && !phone_number) {
|
|
186
|
+
res.status(400).json({ error: "phone_number is required when connection is 'sms'" });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (connection === "email") res.status(200).json({
|
|
190
|
+
_id: "000000000000000000000000",
|
|
191
|
+
email,
|
|
192
|
+
email_verified: false
|
|
193
|
+
});
|
|
194
|
+
else res.status(200).json({
|
|
195
|
+
_id: "000000000000000000000000",
|
|
196
|
+
phone_number,
|
|
197
|
+
phone_verified: false
|
|
198
|
+
});
|
|
199
|
+
} catch (error) {
|
|
200
|
+
next(error);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
//#endregion
|
|
207
|
+
exports.createAuth0Handlers = createAuth0Handlers;
|