@schemavaults/auth-common 0.7.27

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.
Files changed (139) hide show
  1. package/dist/audience-schema.d.ts +3 -0
  2. package/dist/audience-schema.js +12 -0
  3. package/dist/audience-schema.js.map +1 -0
  4. package/dist/auth_acquire_tokens_grant_types.d.ts +80 -0
  5. package/dist/auth_acquire_tokens_grant_types.js +48 -0
  6. package/dist/auth_acquire_tokens_grant_types.js.map +1 -0
  7. package/dist/authenticate_result.d.ts +15 -0
  8. package/dist/authenticate_result.js +12 -0
  9. package/dist/authenticate_result.js.map +1 -0
  10. package/dist/credentials/email_credentials.d.ts +12 -0
  11. package/dist/credentials/email_credentials.js +10 -0
  12. package/dist/credentials/email_credentials.js.map +1 -0
  13. package/dist/credentials/index.d.ts +3 -0
  14. package/dist/credentials/index.js +4 -0
  15. package/dist/credentials/index.js.map +1 -0
  16. package/dist/credentials/password_requirements.d.ts +2 -0
  17. package/dist/credentials/password_requirements.js +17 -0
  18. package/dist/credentials/password_requirements.js.map +1 -0
  19. package/dist/credentials/register_credentials.d.ts +28 -0
  20. package/dist/credentials/register_credentials.js +13 -0
  21. package/dist/credentials/register_credentials.js.map +1 -0
  22. package/dist/frontend-client-state.d.ts +4 -0
  23. package/dist/frontend-client-state.js +2 -0
  24. package/dist/frontend-client-state.js.map +1 -0
  25. package/dist/index.d.ts +21 -0
  26. package/dist/index.js +15 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/invite-code/index.d.ts +4 -0
  29. package/dist/invite-code/index.js +3 -0
  30. package/dist/invite-code/index.js.map +1 -0
  31. package/dist/invite-code/invite-code-definition.d.ts +21 -0
  32. package/dist/invite-code/invite-code-definition.js +18 -0
  33. package/dist/invite-code/invite-code-definition.js.map +1 -0
  34. package/dist/invite-code/invite-code-format.d.ts +3 -0
  35. package/dist/invite-code/invite-code-format.js +9 -0
  36. package/dist/invite-code/invite-code-format.js.map +1 -0
  37. package/dist/is_crypto_api_available.d.ts +1 -0
  38. package/dist/is_crypto_api_available.js +31 -0
  39. package/dist/is_crypto_api_available.js.map +1 -0
  40. package/dist/middleware/auth-middleware-error.d.ts +4 -0
  41. package/dist/middleware/auth-middleware-error.js +12 -0
  42. package/dist/middleware/auth-middleware-error.js.map +1 -0
  43. package/dist/middleware/auth-middleware.d.ts +36 -0
  44. package/dist/middleware/auth-middleware.js +177 -0
  45. package/dist/middleware/auth-middleware.js.map +1 -0
  46. package/dist/middleware/compare-path.d.ts +2 -0
  47. package/dist/middleware/compare-path.js +14 -0
  48. package/dist/middleware/compare-path.js.map +1 -0
  49. package/dist/middleware/decode-first-of-several-jwts.d.ts +10 -0
  50. package/dist/middleware/decode-first-of-several-jwts.js +56 -0
  51. package/dist/middleware/decode-first-of-several-jwts.js.map +1 -0
  52. package/dist/middleware/decode-token-type.d.ts +9 -0
  53. package/dist/middleware/decode-token-type.js +2 -0
  54. package/dist/middleware/decode-token-type.js.map +1 -0
  55. package/dist/middleware/default-auth-middleware-rules.d.ts +7 -0
  56. package/dist/middleware/default-auth-middleware-rules.js +24 -0
  57. package/dist/middleware/default-auth-middleware-rules.js.map +1 -0
  58. package/dist/middleware/determine-auth-status.d.ts +13 -0
  59. package/dist/middleware/determine-auth-status.js +91 -0
  60. package/dist/middleware/determine-auth-status.js.map +1 -0
  61. package/dist/middleware/index.d.ts +10 -0
  62. package/dist/middleware/index.js +6 -0
  63. package/dist/middleware/index.js.map +1 -0
  64. package/dist/middleware/middleware-rules.d.ts +30 -0
  65. package/dist/middleware/middleware-rules.js +117 -0
  66. package/dist/middleware/middleware-rules.js.map +1 -0
  67. package/dist/middleware/parse-navigation-path.d.ts +3 -0
  68. package/dist/middleware/parse-navigation-path.js +28 -0
  69. package/dist/middleware/parse-navigation-path.js.map +1 -0
  70. package/dist/middleware/token-source.d.ts +6 -0
  71. package/dist/middleware/token-source.js +2 -0
  72. package/dist/middleware/token-source.js.map +1 -0
  73. package/dist/organizations/index.d.ts +5 -0
  74. package/dist/organizations/index.js +4 -0
  75. package/dist/organizations/index.js.map +1 -0
  76. package/dist/organizations/organization_constants.d.ts +4 -0
  77. package/dist/organizations/organization_constants.js +5 -0
  78. package/dist/organizations/organization_constants.js.map +1 -0
  79. package/dist/organizations/organization_definition.d.ts +15 -0
  80. package/dist/organizations/organization_definition.js +20 -0
  81. package/dist/organizations/organization_definition.js.map +1 -0
  82. package/dist/organizations/organization_id.d.ts +4 -0
  83. package/dist/organizations/organization_id.js +17 -0
  84. package/dist/organizations/organization_id.js.map +1 -0
  85. package/dist/organizations/schemavaults_org_id.d.ts +1 -0
  86. package/dist/organizations/schemavaults_org_id.js +2 -0
  87. package/dist/organizations/schemavaults_org_id.js.map +1 -0
  88. package/dist/pkce/code_challenge.d.ts +31 -0
  89. package/dist/pkce/code_challenge.js +43 -0
  90. package/dist/pkce/code_challenge.js.map +1 -0
  91. package/dist/pkce/code_verifier.d.ts +27 -0
  92. package/dist/pkce/code_verifier.js +76 -0
  93. package/dist/pkce/code_verifier.js.map +1 -0
  94. package/dist/pkce/index.d.ts +5 -0
  95. package/dist/pkce/index.js +3 -0
  96. package/dist/pkce/index.js.map +1 -0
  97. package/dist/pkce/pkce.d.ts +63 -0
  98. package/dist/pkce/pkce.js +141 -0
  99. package/dist/pkce/pkce.js.map +1 -0
  100. package/dist/pkce/sha256_digest/index.d.ts +1 -0
  101. package/dist/pkce/sha256_digest/index.js +2 -0
  102. package/dist/pkce/sha256_digest/index.js.map +1 -0
  103. package/dist/pkce/sha256_digest/sha256_digest.d.ts +3 -0
  104. package/dist/pkce/sha256_digest/sha256_digest.js +30 -0
  105. package/dist/pkce/sha256_digest/sha256_digest.js.map +1 -0
  106. package/dist/request_tokens_result.d.ts +342 -0
  107. package/dist/request_tokens_result.js +52 -0
  108. package/dist/request_tokens_result.js.map +1 -0
  109. package/dist/sha256_digest/cryptojs_pkg_sha256.d.ts +2 -0
  110. package/dist/sha256_digest/cryptojs_pkg_sha256.js +11 -0
  111. package/dist/sha256_digest/cryptojs_pkg_sha256.js.map +1 -0
  112. package/dist/sha256_digest/index.d.ts +1 -0
  113. package/dist/sha256_digest/index.js +2 -0
  114. package/dist/sha256_digest/index.js.map +1 -0
  115. package/dist/sha256_digest/sha256_digest.d.ts +3 -0
  116. package/dist/sha256_digest/sha256_digest.js +28 -0
  117. package/dist/sha256_digest/sha256_digest.js.map +1 -0
  118. package/dist/sha256_digest/webcrypto_sha256.d.ts +1 -0
  119. package/dist/sha256_digest/webcrypto_sha256.js +5 -0
  120. package/dist/sha256_digest/webcrypto_sha256.js.map +1 -0
  121. package/dist/token-data/index.d.ts +3 -0
  122. package/dist/token-data/index.js +3 -0
  123. package/dist/token-data/index.js.map +1 -0
  124. package/dist/token-data/token-data.d.ts +102 -0
  125. package/dist/token-data/token-data.js +29 -0
  126. package/dist/token-data/token-data.js.map +1 -0
  127. package/dist/token-data/token-expiry.d.ts +16 -0
  128. package/dist/token-data/token-expiry.js +48 -0
  129. package/dist/token-data/token-expiry.js.map +1 -0
  130. package/dist/user_data/index.d.ts +1 -0
  131. package/dist/user_data/index.js +2 -0
  132. package/dist/user_data/index.js.map +1 -0
  133. package/dist/user_data/user_data.d.ts +58 -0
  134. package/dist/user_data/user_data.js +33 -0
  135. package/dist/user_data/user_data.js.map +1 -0
  136. package/dist/utils/maybeStripQuotes.d.ts +2 -0
  137. package/dist/utils/maybeStripQuotes.js +14 -0
  138. package/dist/utils/maybeStripQuotes.js.map +1 -0
  139. package/package.json +43 -0
@@ -0,0 +1,177 @@
1
+ import { parseNavigationPath, } from "./parse-navigation-path";
2
+ import { evaluateAuthMiddlewareRules, } from "./middleware-rules";
3
+ export function AuthMiddleware({ path, authStatus, rules, authedOnUnauthedRouteRedirectTo, unauthedOnAuthedRouteRedirectTo, authorize_uri, successful_logout_redirect_uri, environment, ...opts }) {
4
+ // Determine environment
5
+ if (!environment) {
6
+ throw new TypeError("[AuthMiddleware] Did not receive an 'environment' input option!");
7
+ }
8
+ let debug = false;
9
+ if (typeof opts.debug === "boolean") {
10
+ debug = opts.debug;
11
+ }
12
+ else {
13
+ if (environment === "development" ||
14
+ environment === "test" ||
15
+ environment === "staging") {
16
+ debug = true;
17
+ }
18
+ }
19
+ if (typeof path !== "string") {
20
+ throw new Error("AuthMiddleware: path must be a string.");
21
+ }
22
+ const isAuthorizePage = path.startsWith(authorize_uri);
23
+ const parsedPath = parseNavigationPath(path);
24
+ if (debug) {
25
+ console.log('[AuthMiddleware] Running auth middleware on path: "/' +
26
+ parsedPath.join("/") +
27
+ '"');
28
+ console.log(`[AuthMiddleware] Current authentication status:`, authStatus);
29
+ console.log("[AuthMiddleware] Rules: ", rules);
30
+ }
31
+ // Redirect from the logout page if a URL was supplied
32
+ if (typeof successful_logout_redirect_uri === "string") {
33
+ const isLogoutPage = parsedPath.length === 2 &&
34
+ parsedPath[0] == "auth" &&
35
+ parsedPath[1] == "logout";
36
+ if (isLogoutPage && authStatus.status === "logged-out") {
37
+ return {
38
+ redirect: true,
39
+ redirectTo: successful_logout_redirect_uri,
40
+ remain: false,
41
+ };
42
+ }
43
+ }
44
+ const middlewareRuleDetermination = evaluateAuthMiddlewareRules(parsedPath, authStatus, rules, environment);
45
+ if (debug) {
46
+ console.log("[AuthMiddleware] Middleware situation reducer evaluation: ", middlewareRuleDetermination);
47
+ }
48
+ // A basic sanity check on the result of evaluateAuthMiddlewareRules
49
+ if (middlewareRuleDetermination.length !== 3 ||
50
+ middlewareRuleDetermination[1] !== "on") {
51
+ throw new Error("AuthMiddleware: Invalid middleware rule determination.");
52
+ }
53
+ if (middlewareRuleDetermination[0] === "logged-in") {
54
+ if (debug) {
55
+ console.log("[AuthMiddleware] Reccommending redirect to: ", authedOnUnauthedRouteRedirectTo);
56
+ }
57
+ if (isAuthorizePage) {
58
+ return {
59
+ redirect: true,
60
+ remain: false,
61
+ redirectTo: authedOnUnauthedRouteRedirectTo,
62
+ };
63
+ }
64
+ switch (middlewareRuleDetermination[2]) {
65
+ case "public":
66
+ if (debug) {
67
+ console.log(`[AuthMiddleware] Recommending remain on page: /${parsedPath.join("/")}`);
68
+ }
69
+ return {
70
+ redirect: false,
71
+ remain: true,
72
+ };
73
+ case "unauthed":
74
+ if (debug) {
75
+ console.log(`[AuthMiddleware] Recommending redirect to page: `, authedOnUnauthedRouteRedirectTo, ` ( from current url: ${parsedPath.join(", ")})`);
76
+ }
77
+ return {
78
+ redirect: true,
79
+ remain: false,
80
+ redirectTo: authedOnUnauthedRouteRedirectTo,
81
+ };
82
+ case "authed":
83
+ if (debug) {
84
+ console.log(`[AuthMiddleware] Recommending remain on page: /${parsedPath.join("/")}`);
85
+ }
86
+ return {
87
+ redirect: false,
88
+ remain: true,
89
+ };
90
+ case "api": {
91
+ if (debug) {
92
+ console.log(`[AuthMiddleware] Recommending API request to pass-through: /${parsedPath.join("/")}`);
93
+ }
94
+ return {
95
+ redirect: false,
96
+ remain: true,
97
+ };
98
+ }
99
+ case "admin": {
100
+ if (authStatus.status === "logged-in" && authStatus.admin) {
101
+ if (debug) {
102
+ console.log(`[AuthMiddleware] Recommending admin remain on page: /${parsedPath.join("/")}`);
103
+ }
104
+ return {
105
+ redirect: false,
106
+ remain: true,
107
+ };
108
+ }
109
+ else if (authStatus.status === "logged-in") {
110
+ return {
111
+ redirect: true,
112
+ remain: false,
113
+ redirectTo: authedOnUnauthedRouteRedirectTo,
114
+ };
115
+ }
116
+ else {
117
+ authStatus.status;
118
+ return {
119
+ redirect: true,
120
+ remain: false,
121
+ redirectTo: unauthedOnAuthedRouteRedirectTo,
122
+ };
123
+ }
124
+ }
125
+ default:
126
+ throw new Error("AuthMiddleware: Invalid page security level.");
127
+ }
128
+ }
129
+ else {
130
+ // logged-out
131
+ switch (middlewareRuleDetermination[2]) {
132
+ case "public":
133
+ if (debug) {
134
+ console.log(`[AuthMiddleware] Recommending remain on page: /${parsedPath.join("/")}`);
135
+ }
136
+ return {
137
+ redirect: false,
138
+ remain: true,
139
+ };
140
+ case "unauthed":
141
+ if (debug) {
142
+ console.log(`[AuthMiddleware] Recommending remain on page: /${parsedPath.join("/")}`);
143
+ }
144
+ return {
145
+ redirect: false,
146
+ remain: true,
147
+ };
148
+ case "authed":
149
+ if (debug) {
150
+ console.log(`[AuthMiddleware] Recommending redirect to page: }`, unauthedOnAuthedRouteRedirectTo);
151
+ }
152
+ return {
153
+ redirect: true,
154
+ remain: false,
155
+ redirectTo: unauthedOnAuthedRouteRedirectTo,
156
+ };
157
+ case "admin":
158
+ if (debug) {
159
+ console.log(`[AuthMiddleware] Recommending redirect to page: }`, unauthedOnAuthedRouteRedirectTo);
160
+ }
161
+ return {
162
+ redirect: true,
163
+ remain: false,
164
+ redirectTo: unauthedOnAuthedRouteRedirectTo,
165
+ };
166
+ case "api":
167
+ return {
168
+ redirect: false,
169
+ remain: undefined,
170
+ error: "Unauthorized",
171
+ };
172
+ default:
173
+ throw new Error("AuthMiddleware: Invalid page security level.");
174
+ }
175
+ }
176
+ }
177
+ //# sourceMappingURL=auth-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../src/middleware/auth-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { NavigationPath } from "./parse-navigation-path";
2
+ export declare function comparePath(path: NavigationPath, route: NavigationPath): boolean;
@@ -0,0 +1,14 @@
1
+ export function comparePath(path, route) {
2
+ if (!Array.isArray(path) || !Array.isArray(route)) {
3
+ throw new Error("comparePath: path and route must be arrays of route segments.");
4
+ }
5
+ if (path.length === 0 && route.length === 0) {
6
+ return true;
7
+ }
8
+ if (route.length === 0 && path.length > 0) {
9
+ return false;
10
+ }
11
+ return route.every((segment, i) => segment === path[i]);
12
+ }
13
+ ;
14
+ //# sourceMappingURL=compare-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-path.js","sourceRoot":"","sources":["../../src/middleware/compare-path.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,IAAoB,EAAE,KAAqB;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAAA,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PotentiallyValidTokenSource } from "./token-source";
2
+ import type { DecodeTokenFn } from "./decode-token-type";
3
+ export interface DecodeFirstOfSeveralJwtsInputOptions {
4
+ token_sources: readonly PotentiallyValidTokenSource[];
5
+ decodeJWT: DecodeTokenFn;
6
+ jwt_audience: string;
7
+ }
8
+ type DecodeTokenOutput = Awaited<ReturnType<DecodeTokenFn>>;
9
+ export declare function decodeFirstOfSeveralJwts({ token_sources, decodeJWT, jwt_audience, }: DecodeFirstOfSeveralJwtsInputOptions, debug?: boolean): Promise<DecodeTokenOutput>;
10
+ export {};
@@ -0,0 +1,56 @@
1
+ export async function decodeFirstOfSeveralJwts({ token_sources, decodeJWT, jwt_audience, }, debug = false) {
2
+ const n_token_sources = token_sources.length;
3
+ if (!Array.isArray(token_sources) || n_token_sources === 0) {
4
+ throw new Error("Did not receive a list of tokens to decode");
5
+ }
6
+ console.assert(typeof n_token_sources === "number" && n_token_sources > 0, "Expected there to be at least 1 potentially valid token if this point was reached!");
7
+ if (typeof jwt_audience !== "string") {
8
+ throw new Error("JWT audience is not a string!");
9
+ }
10
+ const decodeTokenPromises = token_sources.map(function (token) {
11
+ const type = token.type;
12
+ const decode_promise = decodeJWT({
13
+ type,
14
+ token: token.token,
15
+ jwt_audience,
16
+ });
17
+ return decode_promise;
18
+ });
19
+ const decodeResults = await Promise.allSettled(decodeTokenPromises);
20
+ const fulfilledDecodePromises = decodeResults.filter(function isFulfilledPromise(result) {
21
+ return result.status === "fulfilled";
22
+ });
23
+ const successfulDecodeResults = fulfilledDecodePromises.map((fulfilled_decode_result) => fulfilled_decode_result.value);
24
+ const n_successful_decode_results = successfulDecodeResults.length;
25
+ if (debug) {
26
+ console.log(`[decodeFirstOfSeveralJwts] Decoded ${n_successful_decode_results}/${n_token_sources} tokens successfully.`);
27
+ }
28
+ const successfulDecodeResult = n_successful_decode_results >= 1;
29
+ if (!successfulDecodeResult) {
30
+ const errorMessage = n_token_sources > 1
31
+ ? `Failed to decode any of the ${n_token_sources} provided JWTs`
32
+ : "Failed to decode the single JWT that was provided!";
33
+ throw new Error(errorMessage);
34
+ }
35
+ function validateSameInfoAcrossTokens() {
36
+ const uids_set = new Set();
37
+ const subs_set = new Set();
38
+ const auds_set = new Set();
39
+ for (const decoded of successfulDecodeResults) {
40
+ uids_set.add(decoded.uid);
41
+ subs_set.add(decoded.sub);
42
+ if (decoded.uid !== decoded.sub) {
43
+ throw new Error("uid not equal to sub");
44
+ }
45
+ }
46
+ if (uids_set.size !== 1 || subs_set.size !== 1) {
47
+ throw new Error("Token decoding produced different user IDs!");
48
+ }
49
+ }
50
+ validateSameInfoAcrossTokens();
51
+ // All of the results should in theory contain the same data-- use the first one (arbitrary)
52
+ console.assert(n_successful_decode_results >= 1, "Expected there to be at least one JWT to have been decoded successfully if this point was reached!");
53
+ const firstSuccessfulResult = successfulDecodeResults[0];
54
+ return firstSuccessfulResult;
55
+ }
56
+ //# sourceMappingURL=decode-first-of-several-jwts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-first-of-several-jwts.js","sourceRoot":"","sources":["../../src/middleware/decode-first-of-several-jwts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { UserData } from "../user_data";
2
+ import type { PotentiallyValidTokenSource } from "./token-source";
3
+ import type { OrganizationID } from "../organizations";
4
+ export interface DecodeTokenFnInputOptions extends PotentiallyValidTokenSource {
5
+ jwt_audience: string;
6
+ }
7
+ export type DecodeTokenFn = (opts: DecodeTokenFnInputOptions) => Promise<UserData & {
8
+ orgs: readonly OrganizationID[];
9
+ }>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decode-token-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-token-type.js","sourceRoot":"","sources":["../../src/middleware/decode-token-type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare const defaultAuthMiddlewareRules: {
2
+ readonly public: [[], ["auth", "logout"], ["auth", "authorize"], ["api", "auth", "token"], ["api", "auth", "logout"], ["api", "environment"], ["error"]];
3
+ readonly unauthed: [["auth", "login"], ["auth", "register"], ["auth", "forgot-password"]];
4
+ readonly authed: [["account"], ["auth", "account"]];
5
+ readonly admin: [["admin"]];
6
+ readonly api: [["api"], ["trpc"]];
7
+ };
@@ -0,0 +1,24 @@
1
+ export const defaultAuthMiddlewareRules = {
2
+ public: [
3
+ [], // The root path is public
4
+ ["auth", "logout"],
5
+ ["auth", "authorize"],
6
+ ["api", "auth", "token"],
7
+ ["api", "auth", "logout"],
8
+ ["api", "environment"], // allow frontend client to ask server what environment this is running in
9
+ ["error"],
10
+ ],
11
+ unauthed: [
12
+ ["auth", "login"],
13
+ ["auth", "register"],
14
+ ["auth", "forgot-password"],
15
+ ],
16
+ authed: [
17
+ // -- by default, all routes require authentication
18
+ ["account"],
19
+ ["auth", "account"],
20
+ ],
21
+ admin: [["admin"]],
22
+ api: [["api"], ["trpc"]],
23
+ };
24
+ //# sourceMappingURL=default-auth-middleware-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-auth-middleware-rules.js","sourceRoot":"","sources":["../../src/middleware/default-auth-middleware-rules.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAE;QACN,EAAE,EAAE,0BAA0B;QAC9B,CAAC,MAAM,EAAE,QAAQ,CAAC;QAClB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;QACxB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACzB,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,0EAA0E;QAClG,CAAC,OAAO,CAAC;KACV;IACD,QAAQ,EAAE;QACR,CAAC,MAAM,EAAE,OAAO,CAAC;QACjB,CAAC,MAAM,EAAE,UAAU,CAAC;QACpB,CAAC,MAAM,EAAE,iBAAiB,CAAC;KAC5B;IACD,MAAM,EAAE;QACN,mDAAmD;QACnD,CAAC,SAAS,CAAC;QACX,CAAC,MAAM,EAAE,SAAS,CAAC;KACpB;IACD,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAClB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;CACc,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { UserData } from "../user_data";
2
+ import type { DecodeTokenFn } from "./decode-token-type";
3
+ import type { AuthenticationStatus } from "./middleware-rules";
4
+ import type { PotentiallyValidTokenSource } from "./token-source";
5
+ export interface DetermineAuthStatusInputOptions {
6
+ user_data?: UserData;
7
+ token_sources?: readonly PotentiallyValidTokenSource[];
8
+ client_type: "server" | "client";
9
+ jwt_audience?: string;
10
+ decodeJWT?: DecodeTokenFn;
11
+ debug?: boolean;
12
+ }
13
+ export declare function determineAuthStatus(opts: DetermineAuthStatusInputOptions): Promise<AuthenticationStatus>;
@@ -0,0 +1,91 @@
1
+ import { decodeFirstOfSeveralJwts } from "./decode-first-of-several-jwts";
2
+ export async function determineAuthStatus(opts) {
3
+ const debug = opts.debug ?? false;
4
+ if (debug) {
5
+ console.log("[determineAuthStatus] Determining auth status with options: ", opts);
6
+ }
7
+ if (!opts.token_sources || !Array.isArray(opts.token_sources)) {
8
+ if (debug) {
9
+ console.warn("[determineAuthStatus] No token sources provided");
10
+ }
11
+ return {
12
+ status: "logged-out",
13
+ };
14
+ }
15
+ // Consider yourself authenticated on the frontend if you have any tokens saved
16
+ // Actually validate the token on the backend
17
+ if (opts.client_type === "client") {
18
+ // this validation is really loose!! if they think they're logged in that's good enough-- server will actually check and tell them
19
+ if ((Array.isArray(opts.token_sources) && opts.token_sources.length >= 1) ||
20
+ opts.user_data) {
21
+ const loggedInDetermination = {
22
+ status: "logged-in",
23
+ admin: opts.user_data?.admin ?? false,
24
+ };
25
+ if (debug) {
26
+ console.log("[determineAuthStatus] Determined user has tokens and is probably logged in: ", loggedInDetermination);
27
+ }
28
+ return loggedInDetermination;
29
+ }
30
+ else {
31
+ if (debug) {
32
+ console.warn("[determineAuthStatus] Client does not appear to have any tokens or user data stored! Treating as unauthenticated!");
33
+ }
34
+ }
35
+ }
36
+ else if (opts.client_type === "server") {
37
+ // Actually validate the token
38
+ // Use a `decodeJWT` function that is only available on the server-side
39
+ if (typeof opts.decodeJWT !== "function") {
40
+ throw new Error("Expected decodeJWT function server-side");
41
+ }
42
+ const jwt_audience = opts.jwt_audience;
43
+ if (typeof jwt_audience !== "string") {
44
+ throw new Error("JWT audience must be set for determineAuthStatus in a server environment!");
45
+ }
46
+ // if no jwt tokens were provided then they are unauthenticated
47
+ if (!Array.isArray(opts.token_sources) || opts.token_sources.length === 0) {
48
+ return {
49
+ status: "logged-out",
50
+ };
51
+ }
52
+ const token_sources = opts.token_sources;
53
+ let decoded_jwt;
54
+ try {
55
+ const decoded = await decodeFirstOfSeveralJwts({
56
+ token_sources,
57
+ decodeJWT: opts.decodeJWT,
58
+ jwt_audience,
59
+ }, debug);
60
+ if (typeof decoded === "object" && !!decoded) {
61
+ decoded_jwt = decoded;
62
+ }
63
+ else {
64
+ throw new Error("Failed to decode JWT into user data");
65
+ }
66
+ }
67
+ catch (e) {
68
+ console.error("[determineAuthStatus] Error decoding JWT: ", e);
69
+ return {
70
+ status: "logged-out",
71
+ };
72
+ }
73
+ if (typeof decoded_jwt !== "object")
74
+ throw new Error("Expected decoded jwt to be an object");
75
+ const admin = Object.hasOwn(decoded_jwt, "admin")
76
+ ? (decoded_jwt.admin ?? false)
77
+ : false;
78
+ return {
79
+ status: "logged-in",
80
+ admin,
81
+ };
82
+ }
83
+ else {
84
+ throw new Error("Invalid environment to run auth middleware auth status determination: " +
85
+ opts.client_type);
86
+ }
87
+ return {
88
+ status: "logged-out",
89
+ };
90
+ }
91
+ //# sourceMappingURL=determine-auth-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"determine-auth-status.js","sourceRoot":"","sources":["../../src/middleware/determine-auth-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { AuthMiddleware } from "./auth-middleware";
2
+ export type { AuthMiddlewareOptions, AuthMiddlewareResult, } from "./auth-middleware";
3
+ export * from "./auth-middleware-error";
4
+ export type * from "./auth-middleware-error";
5
+ export type { AuthMiddlewareRules } from "./middleware-rules";
6
+ export { defaultAuthMiddlewareRules } from "./default-auth-middleware-rules";
7
+ export { determineAuthStatus } from "./determine-auth-status";
8
+ export type { DecodeTokenFn } from "./decode-token-type";
9
+ export type { PotentiallyValidTokenSource } from "./token-source";
10
+ export { decodeFirstOfSeveralJwts, type DecodeFirstOfSeveralJwtsInputOptions, } from "./decode-first-of-several-jwts";
@@ -0,0 +1,6 @@
1
+ export { AuthMiddleware } from "./auth-middleware";
2
+ export * from "./auth-middleware-error";
3
+ export { defaultAuthMiddlewareRules } from "./default-auth-middleware-rules";
4
+ export { determineAuthStatus } from "./determine-auth-status";
5
+ export { decodeFirstOfSeveralJwts, } from "./decode-first-of-several-jwts";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,cAAc,yBAAyB,CAAC;AAIxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAI9D,OAAO,EACL,wBAAwB,GAEzB,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
2
+ import type { NavigationPath } from "./parse-navigation-path";
3
+ import { z } from "zod";
4
+ export declare const pageSecurityLevelSchema: z.ZodEnum<["public", "unauthed", "authed", "admin", "api"]>;
5
+ type PageSecurityLevel = z.infer<typeof pageSecurityLevelSchema>;
6
+ export type AuthMiddlewareRules = Record<PageSecurityLevel, NavigationPath[]>;
7
+ export declare const authenticationStatusSchema: z.ZodUnion<readonly [z.ZodObject<{
8
+ status: z.ZodLiteral<"logged-in">;
9
+ admin: z.ZodOptional<z.ZodBoolean>;
10
+ }, "strict", z.ZodTypeAny, {
11
+ status: "logged-in";
12
+ admin?: boolean | undefined;
13
+ }, {
14
+ status: "logged-in";
15
+ admin?: boolean | undefined;
16
+ }>, z.ZodObject<{
17
+ status: z.ZodLiteral<"logged-out">;
18
+ }, "strict", z.ZodTypeAny, {
19
+ status: "logged-out";
20
+ }, {
21
+ status: "logged-out";
22
+ }>]>;
23
+ export type AuthenticationStatus = z.infer<typeof authenticationStatusSchema>;
24
+ type AuthMiddlewareResult = readonly [
25
+ AuthenticationStatus["status"],
26
+ "on",
27
+ PageSecurityLevel
28
+ ];
29
+ export declare function evaluateAuthMiddlewareRules(currentPath: NavigationPath, authStatus: AuthenticationStatus, rules: AuthMiddlewareRules, environment: SchemaVaultsAppEnvironment): AuthMiddlewareResult;
30
+ export {};
@@ -0,0 +1,117 @@
1
+ import { comparePath } from "./compare-path";
2
+ import { z } from "zod";
3
+ // Every requires authentication by default, unless it is in the public list or the unauthed list.
4
+ // An unauthed route is a route that is only accessible to unauthenticated users.
5
+ // (i.e. redirect users from the login/register pages)
6
+ export const pageSecurityLevelSchema = z.enum([
7
+ "public",
8
+ "unauthed",
9
+ "authed",
10
+ "admin",
11
+ "api",
12
+ ]);
13
+ export const authenticationStatusSchema = z.union([
14
+ z
15
+ .object({
16
+ status: z.literal("logged-in"),
17
+ admin: z.boolean().optional(),
18
+ })
19
+ .required({
20
+ status: true,
21
+ })
22
+ .strict(),
23
+ z
24
+ .object({
25
+ status: z.literal("logged-out"),
26
+ })
27
+ .required({ status: true })
28
+ .strict(),
29
+ ]);
30
+ function isAuthenticationStatus(value) {
31
+ return authenticationStatusSchema.safeParse(value).success;
32
+ }
33
+ export function evaluateAuthMiddlewareRules(
34
+ // The current path (which the middleware is being run on)
35
+ currentPath,
36
+ // The current authentication status of the user (logged in or logged out)
37
+ authStatus,
38
+ // The rules for the middleware to follow, given the current path and authentication status
39
+ rules,
40
+ // App Environment (enables additional debug logging)
41
+ environment) {
42
+ if (!environment) {
43
+ throw new TypeError("'environment' must be provided");
44
+ }
45
+ if (environment === "development") {
46
+ console.log("[AuthMiddleware] Evaluating current path against redirect rules...");
47
+ }
48
+ if (!isAuthenticationStatus(authStatus)) {
49
+ throw new Error("authStatus must be either 'logged-in' or 'logged-out'");
50
+ }
51
+ // Get the page security level
52
+ const defaultPageSecurityLevel = "authed";
53
+ let pageSecurityLevel = defaultPageSecurityLevel;
54
+ try {
55
+ if (environment === "development") {
56
+ console.log("[AuthMiddleware] Current path: ", currentPath);
57
+ try {
58
+ console.log("[AuthMiddleware] Rules: ", rules);
59
+ }
60
+ catch (e) {
61
+ void e; /** no-op */
62
+ }
63
+ }
64
+ if (rules.public.some((route) => {
65
+ const isMatch = comparePath(currentPath, route);
66
+ if (environment === "test" && isMatch) {
67
+ console.log(`[AuthMiddleware] Current path "${currentPath.join("/")}" matches public route: `, route);
68
+ }
69
+ return isMatch;
70
+ })) {
71
+ // Current path matches a public route rule
72
+ pageSecurityLevel = "public";
73
+ }
74
+ else if (rules.unauthed.some((route) => {
75
+ const isMatch = comparePath(currentPath, route);
76
+ if (environment === "test" && isMatch) {
77
+ console.log(`[AuthMiddleware] Current path "${currentPath.join("/")}" matches unauthed route: `, route);
78
+ }
79
+ return isMatch;
80
+ })) {
81
+ // Current path matches an unauthed route rule
82
+ pageSecurityLevel = "unauthed";
83
+ }
84
+ else if (rules.authed?.some((route) => {
85
+ const isMatch = comparePath(currentPath, route);
86
+ if (environment === "test" && isMatch) {
87
+ console.log(`[AuthMiddleware] Current path "${currentPath.join("/")}" matches authed route: `, route);
88
+ }
89
+ return isMatch;
90
+ })) {
91
+ // Current path matches an authed route rule
92
+ pageSecurityLevel = "authed";
93
+ }
94
+ else if (rules.api.some((route) => {
95
+ const isMatch = comparePath(currentPath, route);
96
+ if (environment === "test" && isMatch) {
97
+ console.log(`[AuthMiddleware] Current path "${currentPath.join("/")}" matches api route: `, route);
98
+ }
99
+ return isMatch;
100
+ })) {
101
+ pageSecurityLevel = "api";
102
+ }
103
+ else {
104
+ if (environment === "development") {
105
+ console.log(`[AuthMiddleware] Current path "${currentPath.join("/")}" does not match any route rule-- treating as 'authed' by default`);
106
+ }
107
+ pageSecurityLevel = "authed";
108
+ }
109
+ }
110
+ catch (e) {
111
+ /** default to authed, but log the error */
112
+ console.error(e);
113
+ pageSecurityLevel = defaultPageSecurityLevel;
114
+ }
115
+ return [authStatus.status, "on", pageSecurityLevel];
116
+ }
117
+ //# sourceMappingURL=middleware-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-rules.js","sourceRoot":"","sources":["../../src/middleware/middleware-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type NavigationPath = string[];
2
+ export declare function parseNavigationPath(path_url: string): NavigationPath;
3
+ export default parseNavigationPath;