@simulacrum/auth0-simulator 0.11.1 → 0.11.3
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 +15 -38751
- package/dist/index.d.cts +7 -175
- 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 +37 -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 +34 -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 +9 -9
- package/dist/index.d.ts +0 -189
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -38747
- package/dist/index.js.map +0 -1
- /package/dist/{public → views/public}/img/frontside-logo.png +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-handlers.mjs","names":["user: Auth0User | undefined","nonce: string | undefined","refreshToken: RefreshToken","context: RuleContext<Partial<AccessTokenPayload>, IdTokenData>","userData: RuleUser","idTokenData: IdTokenData","username: string","password: string | undefined","decodeBase64"],"sources":["../../src/handlers/oauth-handlers.ts"],"sourcesContent":["import { assert } from \"assert-ts\";\nimport { decode, decode as decodeBase64 } from \"base64-url\";\nimport { epochTime, expiresAt } from \"../auth/date.ts\";\nimport { createJsonWebToken } from \"../auth/jwt.ts\";\nimport { createRulesRunner } from \"../rules/rules-runner.ts\";\nimport { deriveScope, createPersonQuery } from \"./utils.ts\";\n\nimport type { Request } from \"express\";\nimport type { RuleContext, RuleUser } from \"../rules/types.ts\";\nimport type {\n ScopeConfig,\n AccessTokenPayload,\n GrantType,\n IdTokenData,\n RefreshToken,\n} from \"../types.ts\";\nimport {\n createRefreshToken,\n issueRefreshToken,\n} from \"../auth/refresh-token.ts\";\nimport { type ExtendedSimulationStore } from \"../store/index.ts\";\nimport { type Auth0User } from \"../store/entities.ts\";\n\nexport const createTokens = async ({\n body,\n iss,\n clientID,\n audience,\n rulesDirectory,\n scope: scopeConfig,\n simulationStore,\n}: {\n body: Request[\"body\"];\n iss: string;\n clientID: string;\n audience: string;\n rulesDirectory: string | undefined;\n scope: ScopeConfig;\n simulationStore: ExtendedSimulationStore;\n}) => {\n let { grant_type }: { grant_type: GrantType } = body;\n let scope = deriveScope({ scopeConfig, clientID, audience });\n\n let accessToken = getBaseAccessToken({ iss, grant_type, scope, audience });\n let user: Auth0User | undefined;\n let nonce: string | undefined;\n\n if (grant_type === \"client_credentials\") {\n return { access_token: createJsonWebToken(accessToken) };\n }\n // TODO: check refresh_token expiry date\n else if (grant_type === \"refresh_token\") {\n let { refresh_token: refreshTokenValue } = body;\n let refreshToken: RefreshToken = JSON.parse(decode(refreshTokenValue));\n\n let findUser = createPersonQuery(simulationStore);\n\n user = findUser((person) => person.id === refreshToken.user.id);\n\n nonce = refreshToken.nonce;\n assert(!!nonce, `400::No nonce in request`);\n } else {\n let result = verifyUserExistsInStore({\n simulationStore,\n body,\n grant_type,\n });\n\n user = result.user;\n nonce = result.nonce;\n }\n\n assert(!!user, \"500::No user found\");\n\n let { idTokenData, userData } = getIdToken({\n body,\n iss,\n user,\n clientID,\n nonce,\n });\n\n let context: RuleContext<Partial<AccessTokenPayload>, IdTokenData> = {\n clientID,\n accessToken: { scope, sub: idTokenData.sub },\n idToken: idTokenData,\n };\n\n let rulesRunner = createRulesRunner(rulesDirectory);\n // the rules mutate the values\n await rulesRunner(userData, context);\n\n return {\n access_token: createJsonWebToken({\n ...accessToken,\n ...context.accessToken,\n ...(scope.split(\" \").includes(\"email\") ? { email: user.email } : {}),\n }),\n id_token: createJsonWebToken({\n ...userData,\n ...context.idToken,\n }),\n refresh_token: issueRefreshToken(scope, grant_type)\n ? createRefreshToken({\n exp: idTokenData.exp,\n rotations: 0,\n scope,\n user,\n nonce,\n })\n : undefined,\n };\n};\n\nexport const getIdToken = ({\n body,\n iss,\n user,\n clientID,\n nonce,\n}: {\n body: Request[\"body\"];\n iss: string;\n user: Auth0User;\n clientID: string;\n nonce: string | undefined;\n}) => {\n let userData: RuleUser = {\n name: body?.name ?? user.name,\n email: body?.email ?? user.email,\n email_verified: true,\n user_id: body?.id ?? user.id,\n nickname: body?.nickname,\n picture: body?.picture ?? user.picture,\n identities: body?.identities,\n };\n\n assert(!!user.email, \"500::User in store requires an email\");\n\n let idTokenData: IdTokenData = {\n alg: \"RS256\",\n typ: \"JWT\",\n iss,\n exp: expiresAt(),\n iat: epochTime(),\n email: user.email,\n aud: clientID,\n sub: user.id,\n };\n\n if (typeof nonce !== \"undefined\") {\n idTokenData.nonce = nonce;\n }\n\n return { userData, idTokenData };\n};\n\nexport const getBaseAccessToken = ({\n iss,\n grant_type,\n scope,\n audience,\n}: {\n iss: string;\n grant_type: string;\n scope: string;\n audience: string;\n}): Partial<AccessTokenPayload> => ({\n iss,\n exp: expiresAt(),\n iat: epochTime(),\n aud: audience,\n gty: grant_type,\n scope,\n});\n\nconst verifyUserExistsInStore = ({\n simulationStore,\n body,\n grant_type,\n}: {\n simulationStore: ExtendedSimulationStore;\n body: Request[\"body\"];\n grant_type: string;\n}) => {\n let { code } = body;\n let personQuery = createPersonQuery(simulationStore);\n let nonce: string | undefined;\n let username: string;\n let password: string | undefined;\n\n if (grant_type === \"http://auth0.com/oauth/grant-type/passwordless/otp\") {\n username = body.username;\n } else if (grant_type === \"password\") {\n username = body.username;\n password = body.password;\n } else {\n // specifically grant_type === 'authorization_code'\n // but naively using it to handle other cases at the moment\n assert(typeof code !== \"undefined\", \"400::no code in /oauth/token\");\n [nonce, username] = decodeBase64(code).split(\":\");\n assert(!!username, `400::no nonce in store for ${code}`);\n }\n\n let user: Auth0User | undefined = personQuery((person) => {\n assert(!!person.email, `500::no email defined on person scenario`);\n\n let valid = person.email.toLowerCase() === username.toLowerCase();\n\n if (typeof password === \"undefined\") {\n return valid;\n } else {\n return valid && password === person.password;\n }\n });\n\n assert(!!user, \"401::Unauthorized\");\n\n return { user, nonce };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const require_constants = require('../auth/constants.cjs');
|
|
2
|
+
const require_url = require('./url.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/handlers/openid-handlers.ts
|
|
5
|
+
const createOpenIdHandlers = (serviceURL) => {
|
|
6
|
+
return {
|
|
7
|
+
["/.well-known/jwks.json"]: function(_, res) {
|
|
8
|
+
res.status(200).json(require_constants.JWKS);
|
|
9
|
+
},
|
|
10
|
+
["/.well-known/openid-configuration"]: function(req, res) {
|
|
11
|
+
let url = require_url.removeTrailingSlash(serviceURL(req));
|
|
12
|
+
res.status(200).json({
|
|
13
|
+
issuer: `${url}/`,
|
|
14
|
+
authorization_endpoint: [url, "authorize"].join("/"),
|
|
15
|
+
token_endpoint: [
|
|
16
|
+
url,
|
|
17
|
+
"oauth",
|
|
18
|
+
"token"
|
|
19
|
+
].join("/"),
|
|
20
|
+
userinfo_endpoint: [url, "userinfo"].join("/"),
|
|
21
|
+
jwks_uri: [
|
|
22
|
+
url,
|
|
23
|
+
".well-known",
|
|
24
|
+
"jwks.json"
|
|
25
|
+
].join("/")
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
exports.createOpenIdHandlers = createOpenIdHandlers;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { JWKS } from "../auth/constants.mjs";
|
|
2
|
+
import { removeTrailingSlash } from "./url.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/handlers/openid-handlers.ts
|
|
5
|
+
const createOpenIdHandlers = (serviceURL) => {
|
|
6
|
+
return {
|
|
7
|
+
["/.well-known/jwks.json"]: function(_, res) {
|
|
8
|
+
res.status(200).json(JWKS);
|
|
9
|
+
},
|
|
10
|
+
["/.well-known/openid-configuration"]: function(req, res) {
|
|
11
|
+
let url = removeTrailingSlash(serviceURL(req));
|
|
12
|
+
res.status(200).json({
|
|
13
|
+
issuer: `${url}/`,
|
|
14
|
+
authorization_endpoint: [url, "authorize"].join("/"),
|
|
15
|
+
token_endpoint: [
|
|
16
|
+
url,
|
|
17
|
+
"oauth",
|
|
18
|
+
"token"
|
|
19
|
+
].join("/"),
|
|
20
|
+
userinfo_endpoint: [url, "userinfo"].join("/"),
|
|
21
|
+
jwks_uri: [
|
|
22
|
+
url,
|
|
23
|
+
".well-known",
|
|
24
|
+
"jwks.json"
|
|
25
|
+
].join("/")
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { createOpenIdHandlers };
|
|
33
|
+
//# sourceMappingURL=openid-handlers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openid-handlers.mjs","names":[],"sources":["../../src/handlers/openid-handlers.ts"],"sourcesContent":["import type { Request, RequestHandler } from \"express\";\nimport { JWKS } from \"../auth/constants.ts\";\nimport { removeTrailingSlash } from \"./url.ts\";\n\ntype Routes = \"/jwks.json\" | \"/openid-configuration\";\n\nexport type OpenIdRoutes = `${`/.well-known`}${Routes}`;\n\nexport interface OpenIdConfiguration {\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n userinfo_endpoint: string;\n jwks_uri: string;\n}\n\nexport const createOpenIdHandlers = (\n serviceURL: (request: Request) => string\n): Record<OpenIdRoutes, RequestHandler> => {\n return {\n [\"/.well-known/jwks.json\"]: function (_, res) {\n res.status(200).json(JWKS);\n },\n\n [\"/.well-known/openid-configuration\"]: function (req, res) {\n let url = removeTrailingSlash(serviceURL(req));\n\n res.status(200).json({\n issuer: `${url}/`,\n authorization_endpoint: [url, \"authorize\"].join(\"/\"),\n token_endpoint: [url, \"oauth\", \"token\"].join(\"/\"),\n userinfo_endpoint: [url, \"userinfo\"].join(\"/\"),\n jwks_uri: [url, \".well-known\", \"jwks.json\"].join(\"/\"),\n });\n },\n };\n};\n"],"mappings":";;;;AAgBA,MAAa,wBACX,eACyC;AACzC,QAAO;EACL,CAAC,2BAA2B,SAAU,GAAG,KAAK;AAC5C,OAAI,OAAO,IAAI,CAAC,KAAK,KAAK;;EAG5B,CAAC,sCAAsC,SAAU,KAAK,KAAK;GACzD,IAAI,MAAM,oBAAoB,WAAW,IAAI,CAAC;AAE9C,OAAI,OAAO,IAAI,CAAC,KAAK;IACnB,QAAQ,GAAG,IAAI;IACf,wBAAwB,CAAC,KAAK,YAAY,CAAC,KAAK,IAAI;IACpD,gBAAgB;KAAC;KAAK;KAAS;KAAQ,CAAC,KAAK,IAAI;IACjD,mBAAmB,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI;IAC9C,UAAU;KAAC;KAAK;KAAe;KAAY,CAAC,KAAK,IAAI;IACtD,CAAC;;EAEL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.mjs","names":[],"sources":["../../src/handlers/url.ts"],"sourcesContent":["export const removeTrailingSlash = (url: string): string =>\n url.replace(/\\/$/, \"\");\n"],"mappings":";AAAA,MAAa,uBAAuB,QAClC,IAAI,QAAQ,OAAO,GAAG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
let assert_ts = require("assert-ts");
|
|
3
|
+
|
|
4
|
+
//#region src/handlers/utils.ts
|
|
5
|
+
const createPersonQuery = (store) => (predicate) => {
|
|
6
|
+
return store.schema.users.selectTableAsList(store.store.getState()).find(predicate);
|
|
7
|
+
};
|
|
8
|
+
const deriveScope = ({ scopeConfig, clientID, audience }) => {
|
|
9
|
+
if (typeof scopeConfig === "string") return scopeConfig;
|
|
10
|
+
let defaultScope = scopeConfig.find((application$1) => application$1.clientID === "default");
|
|
11
|
+
(0, assert_ts.assert)(!!clientID, `500::Did not have a clientID to derive the scope`);
|
|
12
|
+
let application = scopeConfig.find((application$1) => application$1.clientID === clientID && (application$1.audience ? application$1.audience === audience : true));
|
|
13
|
+
if (!application) {
|
|
14
|
+
let ignoreAudience = scopeConfig.find((application$1) => application$1.clientID === clientID);
|
|
15
|
+
(0, assert_ts.assert)(ignoreAudience === void 0, `500::Found application matching clientID, ${ignoreAudience?.clientID}, but incorrect audience, configured: ${ignoreAudience?.audience} :: passed: ${audience}`);
|
|
16
|
+
}
|
|
17
|
+
if (!application && defaultScope) application = defaultScope;
|
|
18
|
+
(0, assert_ts.assert)(!!application, `500::Could not find application with clientID: ${clientID}`);
|
|
19
|
+
(0, assert_ts.assert)(!!application.scope, `500::${application.clientID} is expected to have a scope`);
|
|
20
|
+
return application.scope;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.createPersonQuery = createPersonQuery;
|
|
25
|
+
exports.deriveScope = deriveScope;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { assert } from "assert-ts";
|
|
2
|
+
|
|
3
|
+
//#region src/handlers/utils.ts
|
|
4
|
+
const createPersonQuery = (store) => (predicate) => {
|
|
5
|
+
return store.schema.users.selectTableAsList(store.store.getState()).find(predicate);
|
|
6
|
+
};
|
|
7
|
+
const deriveScope = ({ scopeConfig, clientID, audience }) => {
|
|
8
|
+
if (typeof scopeConfig === "string") return scopeConfig;
|
|
9
|
+
let defaultScope = scopeConfig.find((application$1) => application$1.clientID === "default");
|
|
10
|
+
assert(!!clientID, `500::Did not have a clientID to derive the scope`);
|
|
11
|
+
let application = scopeConfig.find((application$1) => application$1.clientID === clientID && (application$1.audience ? application$1.audience === audience : true));
|
|
12
|
+
if (!application) {
|
|
13
|
+
let ignoreAudience = scopeConfig.find((application$1) => application$1.clientID === clientID);
|
|
14
|
+
assert(ignoreAudience === void 0, `500::Found application matching clientID, ${ignoreAudience?.clientID}, but incorrect audience, configured: ${ignoreAudience?.audience} :: passed: ${audience}`);
|
|
15
|
+
}
|
|
16
|
+
if (!application && defaultScope) application = defaultScope;
|
|
17
|
+
assert(!!application, `500::Could not find application with clientID: ${clientID}`);
|
|
18
|
+
assert(!!application.scope, `500::${application.clientID} is expected to have a scope`);
|
|
19
|
+
return application.scope;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createPersonQuery, deriveScope };
|
|
24
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":["application"],"sources":["../../src/handlers/utils.ts"],"sourcesContent":["import { assert } from \"assert-ts\";\nimport type { ScopeConfig } from \"../types.ts\";\nimport type { ExtendedSimulationStore } from \"../store/index.ts\";\nimport type { Auth0User } from \"../store/entities.ts\";\n\ntype Predicate<T> = (this: void, value: T, index: number, obj: T[]) => boolean;\n\nexport const createPersonQuery =\n (store: ExtendedSimulationStore) => (predicate: Predicate<Auth0User>) => {\n const users = store.schema.users.selectTableAsList(store.store.getState());\n return users.find(predicate);\n };\n\nexport const deriveScope = ({\n scopeConfig,\n clientID,\n audience,\n}: {\n scopeConfig: ScopeConfig;\n clientID: string;\n audience: string;\n}) => {\n if (typeof scopeConfig === \"string\") return scopeConfig;\n let defaultScope = scopeConfig.find(\n (application) => application.clientID === \"default\"\n );\n\n assert(!!clientID, `500::Did not have a clientID to derive the scope`);\n\n let application = scopeConfig.find(\n (application) =>\n application.clientID === clientID &&\n (application.audience ? application.audience === audience : true)\n );\n\n if (!application) {\n let ignoreAudience = scopeConfig.find(\n (application) => application.clientID === clientID\n );\n assert(\n ignoreAudience === undefined,\n `500::Found application matching clientID, ${ignoreAudience?.clientID}, but incorrect audience, configured: ${ignoreAudience?.audience} :: passed: ${audience}`\n );\n }\n\n if (!application && defaultScope) {\n application = defaultScope;\n }\n\n assert(\n !!application,\n `500::Could not find application with clientID: ${clientID}`\n );\n\n assert(\n !!application.scope,\n `500::${application.clientID} is expected to have a scope`\n );\n\n return application.scope;\n};\n"],"mappings":";;;AAOA,MAAa,qBACV,WAAoC,cAAoC;AAEvE,QADc,MAAM,OAAO,MAAM,kBAAkB,MAAM,MAAM,UAAU,CAAC,CAC7D,KAAK,UAAU;;AAGhC,MAAa,eAAe,EAC1B,aACA,UACA,eAKI;AACJ,KAAI,OAAO,gBAAgB,SAAU,QAAO;CAC5C,IAAI,eAAe,YAAY,MAC5B,kBAAgBA,cAAY,aAAa,UAC3C;AAED,QAAO,CAAC,CAAC,UAAU,mDAAmD;CAEtE,IAAI,cAAc,YAAY,MAC3B,kBACCA,cAAY,aAAa,aACxBA,cAAY,WAAWA,cAAY,aAAa,WAAW,MAC/D;AAED,KAAI,CAAC,aAAa;EAChB,IAAI,iBAAiB,YAAY,MAC9B,kBAAgBA,cAAY,aAAa,SAC3C;AACD,SACE,mBAAmB,QACnB,6CAA6C,gBAAgB,SAAS,wCAAwC,gBAAgB,SAAS,cAAc,WACtJ;;AAGH,KAAI,CAAC,eAAe,aAClB,eAAc;AAGhB,QACE,CAAC,CAAC,aACF,kDAAkD,WACnD;AAED,QACE,CAAC,CAAC,YAAY,OACd,QAAQ,YAAY,SAAS,8BAC9B;AAED,QAAO,YAAY"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_web_message = require('../views/web-message.cjs');
|
|
3
|
+
let assert_ts = require("assert-ts");
|
|
4
|
+
let base64_url = require("base64-url");
|
|
5
|
+
|
|
6
|
+
//#region src/handlers/web-message.ts
|
|
7
|
+
const createWebMessageHandler = () => function(req, res) {
|
|
8
|
+
(0, assert_ts.assert)(!!req?.session, "no session");
|
|
9
|
+
let username = req.session.username;
|
|
10
|
+
(0, assert_ts.assert)(!!username, `no username in authorise`);
|
|
11
|
+
let { redirect_uri, state, nonce } = req.query;
|
|
12
|
+
res.set("Content-Type", "text/html");
|
|
13
|
+
let message = require_web_message.webMessage({
|
|
14
|
+
code: (0, base64_url.encode)(`${nonce}:${username}`),
|
|
15
|
+
state,
|
|
16
|
+
redirect_uri,
|
|
17
|
+
nonce
|
|
18
|
+
});
|
|
19
|
+
res.status(200).send(Buffer.from(message));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.createWebMessageHandler = createWebMessageHandler;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { webMessage } from "../views/web-message.mjs";
|
|
2
|
+
import { assert } from "assert-ts";
|
|
3
|
+
import { encode } from "base64-url";
|
|
4
|
+
|
|
5
|
+
//#region src/handlers/web-message.ts
|
|
6
|
+
const createWebMessageHandler = () => function(req, res) {
|
|
7
|
+
assert(!!req?.session, "no session");
|
|
8
|
+
let username = req.session.username;
|
|
9
|
+
assert(!!username, `no username in authorise`);
|
|
10
|
+
let { redirect_uri, state, nonce } = req.query;
|
|
11
|
+
res.set("Content-Type", "text/html");
|
|
12
|
+
let message = webMessage({
|
|
13
|
+
code: encode(`${nonce}:${username}`),
|
|
14
|
+
state,
|
|
15
|
+
redirect_uri,
|
|
16
|
+
nonce
|
|
17
|
+
});
|
|
18
|
+
res.status(200).send(Buffer.from(message));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createWebMessageHandler };
|
|
23
|
+
//# sourceMappingURL=web-message.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-message.mjs","names":[],"sources":["../../src/handlers/web-message.ts"],"sourcesContent":["import type { RequestHandler } from \"express\";\nimport { assert } from \"assert-ts\";\nimport { encode } from \"base64-url\";\nimport type { QueryParams } from \"../types.ts\";\nimport { webMessage } from \"../views/web-message.ts\";\n\nexport const createWebMessageHandler = (): RequestHandler =>\n function (req, res) {\n assert(!!req?.session, \"no session\");\n\n let username = req.session.username;\n\n assert(!!username, `no username in authorise`);\n\n let { redirect_uri, state, nonce } = req.query as QueryParams;\n\n res.set(\"Content-Type\", \"text/html\");\n\n let message = webMessage({\n code: encode(`${nonce}:${username}`),\n state,\n redirect_uri,\n nonce,\n });\n\n res.status(200).send(Buffer.from(message));\n };\n"],"mappings":";;;;;AAMA,MAAa,gCACX,SAAU,KAAK,KAAK;AAClB,QAAO,CAAC,CAAC,KAAK,SAAS,aAAa;CAEpC,IAAI,WAAW,IAAI,QAAQ;AAE3B,QAAO,CAAC,CAAC,UAAU,2BAA2B;CAE9C,IAAI,EAAE,cAAc,OAAO,UAAU,IAAI;AAEzC,KAAI,IAAI,gBAAgB,YAAY;CAEpC,IAAI,UAAU,WAAW;EACvB,MAAM,OAAO,GAAG,MAAM,GAAG,WAAW;EACpC;EACA;EACA;EACD,CAAC;AAEF,KAAI,OAAO,IAAI,CAAC,KAAK,OAAO,KAAK,QAAQ,CAAC"}
|