@schemavaults/auth-server-sdk 0.22.85 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/JwtKeyManager/RemoteJwtKeyManager/RemoteJwtKeyManager.d.ts +3 -3
- package/dist/JwtKeyManager/RemoteJwtKeyManager/RemoteJwtKeyManager.js +8 -8
- package/dist/JwtKeyManager/RemoteJwtKeyManager/RemoteJwtKeyManager.js.map +1 -1
- package/dist/JwtKeyManager/RemoteJwtKeyManager/jwksEndpoint.js +3 -3
- package/dist/JwtKeyManager/RemoteJwtKeyManager/jwksEndpoint.js.map +1 -1
- package/dist/JwtKeyManager/RemoteJwtKeyManager/loadRemoteJwks.d.ts +2 -2
- package/dist/JwtKeyManager/RemoteJwtKeyManager/loadRemoteJwks.js +9 -7
- package/dist/JwtKeyManager/RemoteJwtKeyManager/loadRemoteJwks.js.map +1 -1
- package/dist/cli.cjs +2 -2
- package/dist/decode-jwts-with-key-manager.js +6 -2
- package/dist/decode-jwts-with-key-manager.js.map +1 -1
- package/dist/env/get-schemavaults-auth-server-url.d.ts +1 -0
- package/dist/env/get-schemavaults-auth-server-url.js +6 -0
- package/dist/env/get-schemavaults-auth-server-url.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/isUserInOrganization.js +3 -2
- package/dist/isUserInOrganization.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/middlewares/withAuthJwtValidation/withAuthJwtValidation.js +7 -5
- package/dist/middleware/middlewares/withAuthJwtValidation/withAuthJwtValidation.js.map +1 -1
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/IAllowedOriginsResolver.d.ts +11 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/IAllowedOriginsResolver.js +9 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/IAllowedOriginsResolver.js.map +1 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/RemoteAllowedOriginsResolver.d.ts +22 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/RemoteAllowedOriginsResolver.js +106 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/RemoteAllowedOriginsResolver.js.map +1 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/allowedOriginsEndpoint.d.ts +2 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/allowedOriginsEndpoint.js +11 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/allowedOriginsEndpoint.js.map +1 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/index.d.ts +6 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/index.js +4 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/index.js.map +1 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/loadRemoteAllowedOrigins.d.ts +9 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/loadRemoteAllowedOrigins.js +56 -0
- package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/loadRemoteAllowedOrigins.js.map +1 -0
- package/dist/middleware/middlewares/withCorsSettings/index.d.ts +2 -0
- package/dist/middleware/middlewares/withCorsSettings/index.js +1 -0
- package/dist/middleware/middlewares/withCorsSettings/index.js.map +1 -1
- package/dist/middleware/middlewares/withCorsSettings/isAllowedOrigin.d.ts +3 -0
- package/dist/middleware/middlewares/withCorsSettings/isAllowedOrigin.js +46 -55
- package/dist/middleware/middlewares/withCorsSettings/isAllowedOrigin.js.map +1 -1
- package/dist/middleware/middlewares/withCorsSettings/withCorsSettings.d.ts +7 -0
- package/dist/middleware/middlewares/withCorsSettings/withCorsSettings.js +12 -0
- package/dist/middleware/middlewares/withCorsSettings/withCorsSettings.js.map +1 -1
- package/dist/middleware/server-middleware.d.ts +3 -1
- package/dist/middleware/server-middleware.js +9 -5
- package/dist/middleware/server-middleware.js.map +1 -1
- package/dist/route_guards/route-guard-factory.js +2 -2
- package/dist/route_guards/withAuthenticatedRouteGuard/initDefaultJwtKeyManagerForAuthenticatedRouteGuard.js +5 -5
- package/dist/route_guards/withAuthenticatedRouteGuard/withAuthenticatedApiRouteGuard.js +7 -6
- package/dist/route_guards/withAuthenticatedRouteGuard/withAuthenticatedApiRouteGuard.js.map +1 -1
- package/dist/route_guards/withAuthenticatedRouteGuard/withAuthenticatedServerComponentRouteGuard.js +7 -6
- package/dist/route_guards/withAuthenticatedRouteGuard/withAuthenticatedServerComponentRouteGuard.js.map +1 -1
- package/package.json +8 -8
- package/dist/env/get-schemavaults-auth-server-uri.d.ts +0 -1
- package/dist/env/get-schemavaults-auth-server-uri.js +0 -21
- package/dist/env/get-schemavaults-auth-server-uri.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { apiServerIdSchema, getAuthServerAppId, } from "@schemavaults/app-definitions";
|
|
2
|
+
export default function allowedOriginsEndpoint(api_server_id) {
|
|
3
|
+
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
4
|
+
throw new TypeError("Invalid 'api_server_id' to load allowed-origins endpoint URL for!");
|
|
5
|
+
}
|
|
6
|
+
if (api_server_id === getAuthServerAppId()) {
|
|
7
|
+
throw new TypeError("The auth server does not load allowed origins via remote connection!");
|
|
8
|
+
}
|
|
9
|
+
return `/api/resource-server/apis/${api_server_id}/allowed-origins`;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=allowedOriginsEndpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowedOriginsEndpoint.js","sourceRoot":"","sources":["../../../../../src/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/allowedOriginsEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,aAAgB;IAEhB,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CACjB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,kBAAkB,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,SAAS,CACjB,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,6BAA6B,aAAa,kBAAkB,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { RemoteAllowedOriginsResolver, RemoteAllowedOriginsResolver as default, } from "./RemoteAllowedOriginsResolver";
|
|
2
|
+
export type { IRemoteAllowedOriginsResolverConstructorOpts } from "./RemoteAllowedOriginsResolver";
|
|
3
|
+
export type { IAllowedOriginsResolver } from "./IAllowedOriginsResolver";
|
|
4
|
+
export { isAllowedOriginsResolver } from "./IAllowedOriginsResolver";
|
|
5
|
+
export { loadRemoteAllowedOrigins } from "./loadRemoteAllowedOrigins";
|
|
6
|
+
export type { ILoadRemoteAllowedOriginsOpts } from "./loadRemoteAllowedOrigins";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RemoteAllowedOriginsResolver, RemoteAllowedOriginsResolver as default, } from "./RemoteAllowedOriginsResolver";
|
|
2
|
+
export { isAllowedOriginsResolver } from "./IAllowedOriginsResolver";
|
|
3
|
+
export { loadRemoteAllowedOrigins } from "./loadRemoteAllowedOrigins";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
package/dist/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,IAAI,OAAO,GACxC,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ApiServerId } from "@schemavaults/app-definitions";
|
|
2
|
+
export interface ILoadRemoteAllowedOriginsOpts {
|
|
3
|
+
auth_server_url: string;
|
|
4
|
+
api_server_id: ApiServerId;
|
|
5
|
+
jwks_access_private_key: CryptoKey;
|
|
6
|
+
debug?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadRemoteAllowedOrigins({ auth_server_url, api_server_id, jwks_access_private_key, ...opts }: ILoadRemoteAllowedOriginsOpts): Promise<readonly string[]>;
|
|
9
|
+
export default loadRemoteAllowedOrigins;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createJwksAccessProofToken } from "@schemavaults/jwt";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import allowedOriginsEndpoint from "./allowedOriginsEndpoint";
|
|
4
|
+
import { apiServerIdSchema, } from "@schemavaults/app-definitions";
|
|
5
|
+
const allowedOriginsResponseSchema = z.object({
|
|
6
|
+
success: z.literal(true),
|
|
7
|
+
data: z.object({
|
|
8
|
+
origins: z.array(z.string()),
|
|
9
|
+
}),
|
|
10
|
+
});
|
|
11
|
+
export async function loadRemoteAllowedOrigins({ auth_server_url, api_server_id, jwks_access_private_key, ...opts }) {
|
|
12
|
+
const debug = typeof opts.debug === "boolean" ? opts.debug : false;
|
|
13
|
+
if (typeof auth_server_url !== "string") {
|
|
14
|
+
throw new TypeError("Expected 'auth_server_url' to be a string!");
|
|
15
|
+
}
|
|
16
|
+
else if (!auth_server_url.startsWith("http://") &&
|
|
17
|
+
!auth_server_url.startsWith("https://")) {
|
|
18
|
+
throw new TypeError("Expected 'auth_server_url' to start with http:// or https://");
|
|
19
|
+
}
|
|
20
|
+
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
21
|
+
throw new TypeError("Invalid API server ID to load remote allowed origins for!");
|
|
22
|
+
}
|
|
23
|
+
let jwks_access_proof_token;
|
|
24
|
+
try {
|
|
25
|
+
jwks_access_proof_token = await createJwksAccessProofToken({
|
|
26
|
+
api_server_id,
|
|
27
|
+
auth_server_url,
|
|
28
|
+
private_key: jwks_access_private_key,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error(e);
|
|
33
|
+
throw new Error("Failed to create JWKS Access Proof Token!");
|
|
34
|
+
}
|
|
35
|
+
const endpoint = new URL(`${allowedOriginsEndpoint(api_server_id)}`, auth_server_url);
|
|
36
|
+
const response = await fetch(endpoint, {
|
|
37
|
+
method: "GET",
|
|
38
|
+
headers: new Headers({
|
|
39
|
+
Authorization: `Bearer ${jwks_access_proof_token}`,
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok || response.status !== 200) {
|
|
43
|
+
throw new Error(`Failed to load allowed origins from auth server: ${response.status} ${response.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
const body = await response.json();
|
|
46
|
+
const parsed = allowedOriginsResponseSchema.safeParse(body);
|
|
47
|
+
if (!parsed.success) {
|
|
48
|
+
if (debug) {
|
|
49
|
+
console.error("Bad allowed-origins response body that caused error: ", body);
|
|
50
|
+
}
|
|
51
|
+
throw new Error("Unexpected response body shape when loading allowed origins from auth server!");
|
|
52
|
+
}
|
|
53
|
+
return parsed.data.data.origins;
|
|
54
|
+
}
|
|
55
|
+
export default loadRemoteAllowedOrigins;
|
|
56
|
+
//# sourceMappingURL=loadRemoteAllowedOrigins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadRemoteAllowedOrigins.js","sourceRoot":"","sources":["../../../../../src/middleware/middlewares/withCorsSettings/RemoteAllowedOriginsResolver/loadRemoteAllowedOrigins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAEL,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AASvC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAC7C,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,GAAG,IAAI,EACuB;IAC9B,MAAM,KAAK,GAAY,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5E,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,CAAC;SAAM,IACL,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC;QACtC,CAAC,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC,EACvC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CACjB,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,uBAA+B,CAAC;IACpC,IAAI,CAAC;QACH,uBAAuB,GAAG,MAAM,0BAA0B,CAAC;YACzD,aAAa;YACb,eAAe;YACf,WAAW,EAAE,uBAAuB;SACrC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAQ,IAAI,GAAG,CAC3B,GAAG,sBAAsB,CAAC,aAAa,CAAC,EAAE,EAC1C,eAAe,CAChB,CAAC;IACF,MAAM,QAAQ,GAAa,MAAM,KAAK,CAAC,QAAQ,EAAE;QAC/C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,IAAI,OAAO,CAAC;YACnB,aAAa,EAAE,UAAU,uBAAuB,EAAE;SACnD,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,oDAAoD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7F,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CACX,uDAAuD,EACvD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,CAAC;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -2,3 +2,5 @@ export { CorsMiddlewareFactory, CorsMiddlewareFactory as default } from "./withC
|
|
|
2
2
|
export type * from "./withCorsSettings";
|
|
3
3
|
export type { SchemaVaultsCORSEnforcementPolicy } from "./cors-policies";
|
|
4
4
|
export { SchemaVaultsCORSEnforcementPolicies } from "./cors-policies";
|
|
5
|
+
export { RemoteAllowedOriginsResolver } from "./RemoteAllowedOriginsResolver";
|
|
6
|
+
export type { IAllowedOriginsResolver, IRemoteAllowedOriginsResolverConstructorOpts, } from "./RemoteAllowedOriginsResolver";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { CorsMiddlewareFactory, CorsMiddlewareFactory as default } from "./withCorsSettings";
|
|
2
2
|
export { SchemaVaultsCORSEnforcementPolicies } from "./cors-policies";
|
|
3
|
+
export { RemoteAllowedOriginsResolver } from "./RemoteAllowedOriginsResolver";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7F,OAAO,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7F,OAAO,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
2
2
|
import { type SchemaVaultsCORSEnforcementPolicy } from "./cors-policies";
|
|
3
|
+
import type { IAllowedOriginsResolver } from "./RemoteAllowedOriginsResolver";
|
|
3
4
|
interface CheckIfIsAllowedOriginOptions {
|
|
4
5
|
origin: string | null | undefined;
|
|
5
6
|
policy: SchemaVaultsCORSEnforcementPolicy;
|
|
6
7
|
audience: string;
|
|
7
8
|
environment: SchemaVaultsAppEnvironment;
|
|
9
|
+
auth_server_url: string;
|
|
10
|
+
allowed_origins_resolver?: IAllowedOriginsResolver;
|
|
8
11
|
debug?: boolean;
|
|
9
12
|
}
|
|
10
13
|
export declare function isAllowedOrigin(opts: CheckIfIsAllowedOriginOptions): Promise<boolean>;
|
|
@@ -1,84 +1,75 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getAuthServerAppId, } from "@schemavaults/app-definitions";
|
|
2
|
+
import { isOriginInAllowedList } from "@schemavaults/auth-common";
|
|
2
3
|
import { SchemaVaultsCORSEnforcementPolicies as policies, } from "./cors-policies";
|
|
4
|
+
import { JWKS_ACCESS_PRIVATE_KEY_ENV_VAR_NAME } from "../../../env/loadJwksAccessPrivateKey";
|
|
3
5
|
async function enforceValidAppIfOriginApplied(opts) {
|
|
4
|
-
const { origin, audience,
|
|
6
|
+
const { origin, audience, allowed_origins_resolver, debug } = opts;
|
|
5
7
|
if (!origin) {
|
|
6
8
|
return true;
|
|
7
9
|
}
|
|
8
10
|
origin;
|
|
9
|
-
const auth_app_id =
|
|
10
|
-
const
|
|
11
|
-
if (
|
|
11
|
+
const auth_app_id = getAuthServerAppId();
|
|
12
|
+
const auth_server_url = opts.auth_server_url;
|
|
13
|
+
if (audience === auth_app_id &&
|
|
14
|
+
isOriginInAllowedList(origin, [auth_server_url])) {
|
|
12
15
|
if (debug) {
|
|
13
16
|
console.log("[isAllowedOrigin] Ensuring that auth client application can reach auth server backend...");
|
|
14
17
|
}
|
|
15
18
|
return true;
|
|
16
19
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
return true;
|
|
20
|
+
if (audience === auth_app_id) {
|
|
21
|
+
// The auth server validates client-app origins itself with database
|
|
22
|
+
// access (see auth-server's cors-for-client-app); the remote
|
|
23
|
+
// allowed-origins lookup rejects the auth app id.
|
|
24
|
+
console.warn(`[isAllowedOrigin] Origin "${origin}" is not the auth server's own origin; denying for audience '${auth_app_id}'.`);
|
|
25
|
+
return false;
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.log("[isAllowedOrigin] Ensuring that @schemavaults/registry-server frontend application can reach registry API server backend...");
|
|
31
|
-
}
|
|
32
|
-
return true;
|
|
27
|
+
if (!allowed_origins_resolver) {
|
|
28
|
+
console.error("[isAllowedOrigin] No allowed-origins resolver available to validate origin against the auth server; denying. " +
|
|
29
|
+
"Pass 'allowed_origins_resolver' or use the default RemoteAllowedOriginsResolver.");
|
|
30
|
+
return false;
|
|
33
31
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (debug) {
|
|
38
|
-
console.log("[isAllowedOrigin] Ensuring that @schemavaults/web application can reach mail API server backend...");
|
|
39
|
-
}
|
|
40
|
-
return true;
|
|
32
|
+
if (!allowed_origins_resolver.isConfigured()) {
|
|
33
|
+
console.error(`[isAllowedOrigin] Allowed-origins resolver is not configured (is the '${JWKS_ACCESS_PRIVATE_KEY_ENV_VAR_NAME}' environment variable set?); denying origin "${origin}".`);
|
|
34
|
+
return false;
|
|
41
35
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
try {
|
|
37
|
+
const allowedOrigins = await allowed_origins_resolver.loadAllowedOrigins(audience);
|
|
38
|
+
const allowed = isOriginInAllowedList(origin, allowedOrigins);
|
|
45
39
|
if (debug) {
|
|
46
|
-
console.log(
|
|
40
|
+
console.log(`[isAllowedOrigin] Origin "${origin}" ${allowed ? "is" : "is not"} in the allowed-origins list for audience '${audience}' (${allowedOrigins.length} allowed origin${allowedOrigins.length === 1 ? "" : "s"})`);
|
|
47
41
|
}
|
|
48
|
-
return
|
|
42
|
+
return allowed;
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
// Fail closed: if the allowed origins can't be determined, deny.
|
|
46
|
+
console.error(`[isAllowedOrigin] Failed to load allowed origins for audience '${audience}'; denying origin "${origin}". Error: `, e);
|
|
47
|
+
return false;
|
|
49
48
|
}
|
|
50
|
-
console.warn("[isAllowedOrigin] This is only half implemented-- need to check if origin is valid for non-hardcoded API servers!");
|
|
51
|
-
return false;
|
|
52
49
|
}
|
|
53
50
|
async function sameOriginIfOriginApplied(opts) {
|
|
54
|
-
const { origin, audience,
|
|
51
|
+
const { origin, audience, debug } = opts;
|
|
55
52
|
if (!origin) {
|
|
56
53
|
return true;
|
|
57
54
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
let hardcoded_app_uri;
|
|
55
|
+
let parsedOrigin;
|
|
56
|
+
let parsedAudience;
|
|
64
57
|
try {
|
|
65
|
-
|
|
58
|
+
parsedOrigin = new URL(origin);
|
|
59
|
+
parsedAudience = new URL(audience);
|
|
66
60
|
}
|
|
67
|
-
catch
|
|
68
|
-
|
|
61
|
+
catch {
|
|
62
|
+
// "Same origin" is only meaningful when the audience is itself a URL
|
|
63
|
+
// (e.g. the auth server); an api_server_id audience can't match.
|
|
64
|
+
console.warn(`[isAllowedOrigin] Cannot compare origin "${origin}" to non-URL audience '${audience}' for same-origin policy; denying.`);
|
|
65
|
+
return false;
|
|
69
66
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
if (debug) {
|
|
76
|
-
console.warn(`[isAllowedOrigin] Denying due to mismatch between request origin and hardcoded app domain on record: ('${hardcoded_app_uri}')`);
|
|
77
|
-
}
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
67
|
+
// Comparing URL.origin normalizes casing and default ports.
|
|
68
|
+
const sameOrigin = parsedOrigin.origin === parsedAudience.origin;
|
|
69
|
+
if (debug) {
|
|
70
|
+
console.log(`[isAllowedOrigin] Origin "${origin}" ${sameOrigin ? "matches" : "does not match"} audience origin "${parsedAudience.origin}"`);
|
|
80
71
|
}
|
|
81
|
-
|
|
72
|
+
return sameOrigin;
|
|
82
73
|
}
|
|
83
74
|
export async function isAllowedOrigin(opts) {
|
|
84
75
|
const { policy, environment, debug } = opts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isAllowedOrigin.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/isAllowedOrigin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"isAllowedOrigin.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/isAllowedOrigin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { NextResponse } from "next/server";
|
|
2
|
+
import type { SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
2
3
|
import { type SchemaVaultsCORSEnforcementPolicy } from "./cors-policies";
|
|
4
|
+
import { type IAllowedOriginsResolver } from "./RemoteAllowedOriginsResolver";
|
|
3
5
|
import type { ISchemaVaultsMiddleware, ISchemaVaultsMiddlewareFactory, ISchemaVaultsMiddlewareFnInputs } from "../../middleware_types";
|
|
4
6
|
import { BaseMiddleware, type IBaseMiddlewareInitOptions } from "../BaseMiddleware";
|
|
5
7
|
export interface CorsSettings {
|
|
6
8
|
debug?: boolean;
|
|
7
9
|
policy: SchemaVaultsCORSEnforcementPolicy;
|
|
8
10
|
audience: string;
|
|
11
|
+
auth_server_url: string;
|
|
12
|
+
environment?: SchemaVaultsAppEnvironment;
|
|
13
|
+
allowed_origins_resolver?: IAllowedOriginsResolver;
|
|
9
14
|
}
|
|
10
15
|
interface CorsMiddlewareSettings extends CorsSettings, Omit<IBaseMiddlewareInitOptions, "name"> {
|
|
11
16
|
next: ISchemaVaultsMiddleware;
|
|
@@ -13,6 +18,8 @@ interface CorsMiddlewareSettings extends CorsSettings, Omit<IBaseMiddlewareInitO
|
|
|
13
18
|
declare class CorsMiddleware extends BaseMiddleware implements ISchemaVaultsMiddleware {
|
|
14
19
|
private readonly policy;
|
|
15
20
|
private readonly audience;
|
|
21
|
+
private readonly auth_server_url;
|
|
22
|
+
private readonly allowed_origins_resolver;
|
|
16
23
|
constructor(settings: CorsMiddlewareSettings);
|
|
17
24
|
handle({ req, json, ...inputs }: ISchemaVaultsMiddlewareFnInputs): Promise<NextResponse | Response>;
|
|
18
25
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { applyCorsHeaders } from "./applyCorsHeaders";
|
|
2
2
|
import { isValidCORSEnforcementPolicy, SchemaVaultsCORSEnforcementPolicies as policies, } from "./cors-policies";
|
|
3
3
|
import { isAllowedOrigin } from "./isAllowedOrigin";
|
|
4
|
+
import { RemoteAllowedOriginsResolver, } from "./RemoteAllowedOriginsResolver";
|
|
4
5
|
import { ensureHttpsInProduction } from "./ensureHttpsInProd";
|
|
5
6
|
import { BaseMiddleware, } from "../BaseMiddleware";
|
|
6
7
|
import { assertNoOriginSet } from "./assertNoOriginSet";
|
|
@@ -8,6 +9,8 @@ import { prettyPrintAvailablePolicies } from "./pretty-print-available-policies"
|
|
|
8
9
|
class CorsMiddleware extends BaseMiddleware {
|
|
9
10
|
policy;
|
|
10
11
|
audience;
|
|
12
|
+
auth_server_url;
|
|
13
|
+
allowed_origins_resolver;
|
|
11
14
|
constructor(settings) {
|
|
12
15
|
super({
|
|
13
16
|
...settings,
|
|
@@ -19,6 +22,13 @@ class CorsMiddleware extends BaseMiddleware {
|
|
|
19
22
|
}
|
|
20
23
|
this.policy = settings.policy;
|
|
21
24
|
this.audience = settings.audience;
|
|
25
|
+
this.auth_server_url = settings.auth_server_url;
|
|
26
|
+
this.allowed_origins_resolver =
|
|
27
|
+
settings.allowed_origins_resolver ??
|
|
28
|
+
new RemoteAllowedOriginsResolver({
|
|
29
|
+
auth_server_url: settings.auth_server_url,
|
|
30
|
+
debug: settings.debug,
|
|
31
|
+
});
|
|
22
32
|
}
|
|
23
33
|
async handle({ req, json, ...inputs }) {
|
|
24
34
|
const DEBUG = this.debug;
|
|
@@ -39,6 +49,8 @@ class CorsMiddleware extends BaseMiddleware {
|
|
|
39
49
|
audience,
|
|
40
50
|
debug: DEBUG,
|
|
41
51
|
environment: this.environment,
|
|
52
|
+
auth_server_url: this.auth_server_url,
|
|
53
|
+
allowed_origins_resolver: this.allowed_origins_resolver,
|
|
42
54
|
});
|
|
43
55
|
if (DEBUG) {
|
|
44
56
|
console.log(`[withCorsSettings] ${isOriginSet ? "An" : "No"} origin is set. ${isOriginSet ? `Origin "${origin}"` : "Not having an origin"} ${isAllowed ? "is" : "is not"} allowed for audience "${audience}"`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withCorsSettings.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/withCorsSettings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"withCorsSettings.js","sourceRoot":"","sources":["../../../../src/middleware/middlewares/withCorsSettings/withCorsSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import type { AuthMiddlewareRules } from "@schemavaults/auth-common";
|
|
2
2
|
import type { NextResponse } from "next/server";
|
|
3
3
|
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
4
|
-
import { type SchemaVaultsCORSEnforcementPolicy } from "./middlewares/withCorsSettings";
|
|
4
|
+
import { type IAllowedOriginsResolver, type SchemaVaultsCORSEnforcementPolicy } from "./middlewares/withCorsSettings";
|
|
5
5
|
import type { ISchemaVaultsMiddleware, ISchemaVaultsMiddlewareFnInputs } from "./middleware_types";
|
|
6
6
|
import BaseMiddleware from "./middlewares/BaseMiddleware";
|
|
7
7
|
import type { IJwtKeyManager } from "../JwtKeyManager";
|
|
8
8
|
export interface IServerMiddlewareInitializationOptions {
|
|
9
|
+
auth_server_url: string;
|
|
9
10
|
api_server_id?: string;
|
|
10
11
|
auth_middleware_rules?: AuthMiddlewareRules;
|
|
11
12
|
debug?: boolean;
|
|
12
13
|
cors_policy?: SchemaVaultsCORSEnforcementPolicy;
|
|
13
14
|
environment?: SchemaVaultsAppEnvironment;
|
|
14
15
|
jwt_keys_manager?: IJwtKeyManager;
|
|
16
|
+
allowed_origins_resolver?: IAllowedOriginsResolver;
|
|
15
17
|
}
|
|
16
18
|
export declare class SchemaVaultsServerMiddleware extends BaseMiddleware implements ISchemaVaultsMiddleware {
|
|
17
19
|
readonly options: IServerMiddlewareInitializationOptions;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// server-middleware.ts
|
|
2
2
|
import { MiddlewareChain, } from "./middleware_chain";
|
|
3
|
-
import { apiServerIdSchema, getAppEnvironment,
|
|
3
|
+
import { apiServerIdSchema, getAppEnvironment, getAuthServerAppId, } from "@schemavaults/app-definitions";
|
|
4
4
|
/** Middlewares Imports */
|
|
5
5
|
import AuthJwtValidationMiddlewareFactory from "./middlewares/withAuthJwtValidation";
|
|
6
6
|
import CorsMiddlewareFactory, { SchemaVaultsCORSEnforcementPolicies as cors_policies, } from "./middlewares/withCorsSettings";
|
|
@@ -33,7 +33,8 @@ export class SchemaVaultsServerMiddleware extends BaseMiddleware {
|
|
|
33
33
|
}
|
|
34
34
|
const audience = opts.api_server_id;
|
|
35
35
|
const environment = opts.environment ?? getAppEnvironment();
|
|
36
|
-
const isAuthServer = audience ===
|
|
36
|
+
const isAuthServer = audience === opts.auth_server_url ||
|
|
37
|
+
audience === getAuthServerAppId();
|
|
37
38
|
let jwt_keys_manager;
|
|
38
39
|
if (isAuthServer) {
|
|
39
40
|
if (!opts.jwt_keys_manager) {
|
|
@@ -42,15 +43,15 @@ export class SchemaVaultsServerMiddleware extends BaseMiddleware {
|
|
|
42
43
|
jwt_keys_manager = opts.jwt_keys_manager;
|
|
43
44
|
}
|
|
44
45
|
else {
|
|
45
|
-
if (audience ===
|
|
46
|
-
throw new
|
|
46
|
+
if (audience === opts.auth_server_url) {
|
|
47
|
+
throw new TypeError("Expected this to not be the auth server if this point was reached!");
|
|
47
48
|
}
|
|
48
49
|
if (opts.jwt_keys_manager) {
|
|
49
50
|
jwt_keys_manager = opts.jwt_keys_manager;
|
|
50
51
|
}
|
|
51
52
|
else {
|
|
52
53
|
jwt_keys_manager = new RemoteJwtKeyManager({
|
|
53
|
-
|
|
54
|
+
auth_server_url: opts.auth_server_url,
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
}
|
|
@@ -68,6 +69,9 @@ export class SchemaVaultsServerMiddleware extends BaseMiddleware {
|
|
|
68
69
|
debug: debug,
|
|
69
70
|
audience,
|
|
70
71
|
policy: cors_policy,
|
|
72
|
+
auth_server_url: opts.auth_server_url,
|
|
73
|
+
environment,
|
|
74
|
+
allowed_origins_resolver: opts.allowed_origins_resolver,
|
|
71
75
|
}),
|
|
72
76
|
new AuthJwtValidationMiddlewareFactory({
|
|
73
77
|
audience,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-middleware.js","sourceRoot":"","sources":["../../src/middleware/server-middleware.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAGvB,OAAO,EAEL,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"server-middleware.js","sourceRoot":"","sources":["../../src/middleware/server-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import AuthenticationRequiredRouteGuard from "./authenticated";
|
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { apiServerIdSchema, getAppEnvironment, } from "@schemavaults/app-definitions";
|
|
6
6
|
import { RemoteJwtKeyManager } from "../JwtKeyManager";
|
|
7
|
-
import getSchemaVaultsAuthServerUri from "../env/get-schemavaults-auth-server-
|
|
7
|
+
import getSchemaVaultsAuthServerUri from "../env/get-schemavaults-auth-server-url";
|
|
8
8
|
import decodeJWTsWithKeyManager from "../decode-jwts-with-key-manager";
|
|
9
9
|
const GUARD_TYPES = [
|
|
10
10
|
"authenticated",
|
|
@@ -62,7 +62,7 @@ export class RouteGuardFactory {
|
|
|
62
62
|
console.log("[RouteGuardFactory] Creating default 'jwt_keys_manager' for remote resource server (loads keys from auth server)!");
|
|
63
63
|
}
|
|
64
64
|
this.jwt_keys_manager = new RemoteJwtKeyManager({
|
|
65
|
-
|
|
65
|
+
auth_server_url: getSchemaVaultsAuthServerUri(),
|
|
66
66
|
debug: this.debug,
|
|
67
67
|
});
|
|
68
68
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import getSchemaVaultsAuthServerUrl from "../../env/get-schemavaults-auth-server-url";
|
|
2
2
|
import RemoteJwtKeyManager from "../../JwtKeyManager/RemoteJwtKeyManager";
|
|
3
3
|
// default key manager is RemoteJwtKeyManager-- makes it easier for external apps, we can overwrite this once for the auth server
|
|
4
4
|
export function initDefaultJwtKeyManagerForAuthenticatedRouteGuard(debug = process.env.NODE_ENV === "development") {
|
|
5
|
-
let
|
|
5
|
+
let auth_server_url;
|
|
6
6
|
try {
|
|
7
|
-
|
|
7
|
+
auth_server_url = getSchemaVaultsAuthServerUrl();
|
|
8
8
|
}
|
|
9
9
|
catch (e) {
|
|
10
|
-
//
|
|
10
|
+
// getSchemaVaultsAuthServerUrl() throws when SCHEMAVAULTS_AUTH_SERVER_URI
|
|
11
11
|
// is set to an invalid value (wrong protocol, or http:// in
|
|
12
12
|
// production/staging). Surface this in the logs before letting the
|
|
13
13
|
// exception propagate up to the route guard.
|
|
@@ -15,7 +15,7 @@ export function initDefaultJwtKeyManagerForAuthenticatedRouteGuard(debug = proce
|
|
|
15
15
|
throw e;
|
|
16
16
|
}
|
|
17
17
|
return new RemoteJwtKeyManager({
|
|
18
|
-
|
|
18
|
+
auth_server_url,
|
|
19
19
|
debug,
|
|
20
20
|
});
|
|
21
21
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getAppEnvironment, getAuthServerAppId, } from "@schemavaults/app-definitions";
|
|
2
2
|
import { accessTokenDataSchema, isValidOrganizationID, organizationIdSchema, userDataSchema, } from "@schemavaults/auth-common";
|
|
3
3
|
import isUserInOrganizationFromAuthServer from "../../isUserInOrganization";
|
|
4
|
-
import getSchemaVaultsAuthServerUri from "../../env/get-schemavaults-auth-server-
|
|
4
|
+
import getSchemaVaultsAuthServerUri from "../../env/get-schemavaults-auth-server-url";
|
|
5
5
|
import loadJwksAccessPrivateKey from "../../env/loadJwksAccessPrivateKey/loadJwksAccessPrivateKey";
|
|
6
6
|
import RouteGuardFactory from "../../route_guards/route-guard-factory";
|
|
7
7
|
import getStringByteSize from "../../getStringByteSize";
|
|
@@ -65,9 +65,10 @@ export function withAuthenticatedApiRouteGuard(api_route_handler, additional_cus
|
|
|
65
65
|
const token_sources = [
|
|
66
66
|
...(opts?.additional_token_sources ?? []),
|
|
67
67
|
];
|
|
68
|
+
const auth_server_app_id = getAuthServerAppId();
|
|
68
69
|
// Load refresh token cookie for auth server
|
|
69
|
-
if (api_server_id ===
|
|
70
|
-
const refresh_token_cookie = req.cookies.get(RefreshTokenCookieName(
|
|
70
|
+
if (api_server_id === auth_server_app_id) {
|
|
71
|
+
const refresh_token_cookie = req.cookies.get(RefreshTokenCookieName(auth_server_app_id));
|
|
71
72
|
if (typeof refresh_token_cookie?.value === "string" &&
|
|
72
73
|
refresh_token_cookie.value.length > 64 &&
|
|
73
74
|
getStringByteSize(refresh_token_cookie.value) <=
|
|
@@ -154,7 +155,7 @@ export function withAuthenticatedApiRouteGuard(api_route_handler, additional_cus
|
|
|
154
155
|
}
|
|
155
156
|
const route_guard = await new RouteGuardFactory({
|
|
156
157
|
environment,
|
|
157
|
-
is_auth_server: api_server_id ===
|
|
158
|
+
is_auth_server: api_server_id === auth_server_app_id,
|
|
158
159
|
jwt_keys_manager,
|
|
159
160
|
}).createGuardFromTokenSources(route_guard_type, token_sources, api_server_id);
|
|
160
161
|
if (!route_guard.user) {
|
|
@@ -194,7 +195,7 @@ export function withAuthenticatedApiRouteGuard(api_route_handler, additional_cus
|
|
|
194
195
|
throw new TypeError("Invalid organization ID to check user's role for!");
|
|
195
196
|
}
|
|
196
197
|
const custom_is_user_in_organization = opts?.custom_is_user_in_organization;
|
|
197
|
-
if (api_server_id ===
|
|
198
|
+
if (api_server_id === auth_server_app_id &&
|
|
198
199
|
typeof custom_is_user_in_organization !== "function") {
|
|
199
200
|
throw new TypeError("A 'custom_is_user_in_organization' method must be passed to route guard when used for @schemavaults/auth-server!");
|
|
200
201
|
}
|