@heavybit/shared-lib 2.1.0 → 2.7.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/README.md +163 -2
- package/dist/cjs/access/index.js +9 -1
- package/dist/cjs/access/index.js.map +1 -1
- package/dist/cjs/approvals/index.js +137 -0
- package/dist/cjs/approvals/index.js.map +1 -0
- package/dist/cjs/audit/index.js +74 -0
- package/dist/cjs/audit/index.js.map +1 -0
- package/dist/cjs/cache/index.js +90 -16
- package/dist/cjs/cache/index.js.map +1 -1
- package/dist/cjs/cache/keyspace.js +101 -0
- package/dist/cjs/cache/keyspace.js.map +1 -0
- package/dist/cjs/common/circuit-breaker.js +74 -0
- package/dist/cjs/common/circuit-breaker.js.map +1 -0
- package/dist/cjs/common/index.js +4 -0
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/internal-client.js +177 -0
- package/dist/cjs/common/internal-client.js.map +1 -0
- package/dist/cjs/common/internal-constants.js +12 -0
- package/dist/cjs/common/internal-constants.js.map +1 -0
- package/dist/cjs/common/internal-service-auth.js +160 -0
- package/dist/cjs/common/internal-service-auth.js.map +1 -0
- package/dist/cjs/common/money.js +215 -0
- package/dist/cjs/common/money.js.map +1 -0
- package/dist/cjs/common/phone.js +41 -22
- package/dist/cjs/common/phone.js.map +1 -1
- package/dist/cjs/common/time.js +28 -2
- package/dist/cjs/common/time.js.map +1 -1
- package/dist/cjs/config/index.js +139 -19
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/contracts/notification-dispatch.js +1 -1
- package/dist/cjs/database/db.js +37 -0
- package/dist/cjs/database/db.js.map +1 -0
- package/dist/cjs/database/index.js +22 -51
- package/dist/cjs/database/index.js.map +1 -1
- package/dist/cjs/database/pagination.js +88 -0
- package/dist/cjs/database/pagination.js.map +1 -0
- package/dist/cjs/database/pool.js +60 -0
- package/dist/cjs/database/pool.js.map +1 -0
- package/dist/cjs/database/scoped-repository.js +132 -0
- package/dist/cjs/database/scoped-repository.js.map +1 -0
- package/dist/cjs/database/scopes.js +166 -0
- package/dist/cjs/database/scopes.js.map +1 -0
- package/dist/cjs/database/table-names.js +14 -0
- package/dist/cjs/database/table-names.js.map +1 -0
- package/dist/cjs/database/tables.js +71 -0
- package/dist/cjs/database/tables.js.map +1 -0
- package/dist/cjs/express/auth.js +64 -50
- package/dist/cjs/express/auth.js.map +1 -1
- package/dist/cjs/express/index.js +2 -0
- package/dist/cjs/express/index.js.map +1 -1
- package/dist/cjs/express/internal-caller.js +52 -0
- package/dist/cjs/express/internal-caller.js.map +1 -0
- package/dist/cjs/express/step-up.js +41 -0
- package/dist/cjs/express/step-up.js.map +1 -0
- package/dist/cjs/http/index.js +3 -71
- package/dist/cjs/http/index.js.map +1 -1
- package/dist/cjs/identity/index.js +269 -67
- package/dist/cjs/identity/index.js.map +1 -1
- package/dist/cjs/identity/step-up.js +52 -0
- package/dist/cjs/identity/step-up.js.map +1 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/knex/columns.js +36 -0
- package/dist/cjs/knex/columns.js.map +1 -0
- package/dist/cjs/knex/index.js +26 -43
- package/dist/cjs/knex/index.js.map +1 -1
- package/dist/cjs/knex/migration-helpers.js +57 -0
- package/dist/cjs/knex/migration-helpers.js.map +1 -0
- package/dist/cjs/logging/redact.js +6 -11
- package/dist/cjs/logging/redact.js.map +1 -1
- package/dist/cjs/messaging/base-consumer.js +36 -0
- package/dist/cjs/messaging/base-consumer.js.map +1 -0
- package/dist/cjs/messaging/consumer.js +142 -73
- package/dist/cjs/messaging/consumer.js.map +1 -1
- package/dist/cjs/messaging/envelope.js +53 -10
- package/dist/cjs/messaging/envelope.js.map +1 -1
- package/dist/cjs/messaging/idempotency.js +95 -8
- package/dist/cjs/messaging/idempotency.js.map +1 -1
- package/dist/cjs/messaging/index.js +2 -1
- package/dist/cjs/messaging/index.js.map +1 -1
- package/dist/cjs/messaging/outbox.js +97 -55
- package/dist/cjs/messaging/outbox.js.map +1 -1
- package/dist/cjs/messaging/publisher.js +86 -38
- package/dist/cjs/messaging/publisher.js.map +1 -1
- package/dist/cjs/messaging/staff-notifier.js +4 -4
- package/dist/cjs/messaging/staff-notifier.js.map +1 -1
- package/dist/cjs/messaging/topology.js +41 -5
- package/dist/cjs/messaging/topology.js.map +1 -1
- package/dist/cjs/rate-limit/index.js +57 -6
- package/dist/cjs/rate-limit/index.js.map +1 -1
- package/dist/cjs/rate-limit/keys.js +47 -0
- package/dist/cjs/rate-limit/keys.js.map +1 -0
- package/dist/cjs/socket/index.js +127 -16
- package/dist/cjs/socket/index.js.map +1 -1
- package/dist/cjs/socket/ticket.js +124 -0
- package/dist/cjs/socket/ticket.js.map +1 -0
- package/dist/cjs/testing/index.js +23 -14
- package/dist/cjs/testing/index.js.map +1 -1
- package/dist/esm/access/index.js +9 -1
- package/dist/esm/access/index.js.map +1 -1
- package/dist/esm/approvals/index.js +127 -0
- package/dist/esm/approvals/index.js.map +1 -0
- package/dist/esm/audit/index.js +70 -0
- package/dist/esm/audit/index.js.map +1 -0
- package/dist/esm/cache/index.js +70 -13
- package/dist/esm/cache/index.js.map +1 -1
- package/dist/esm/cache/keyspace.js +95 -0
- package/dist/esm/cache/keyspace.js.map +1 -0
- package/dist/esm/common/circuit-breaker.js +70 -0
- package/dist/esm/common/circuit-breaker.js.map +1 -0
- package/dist/esm/common/index.js +4 -0
- package/dist/esm/common/index.js.map +1 -1
- package/dist/esm/common/internal-client.js +173 -0
- package/dist/esm/common/internal-client.js.map +1 -0
- package/dist/esm/common/internal-constants.js +9 -0
- package/dist/esm/common/internal-constants.js.map +1 -0
- package/dist/esm/common/internal-service-auth.js +150 -0
- package/dist/esm/common/internal-service-auth.js.map +1 -0
- package/dist/esm/common/money.js +207 -0
- package/dist/esm/common/money.js.map +1 -0
- package/dist/esm/common/phone.js +41 -22
- package/dist/esm/common/phone.js.map +1 -1
- package/dist/esm/common/time.js +27 -2
- package/dist/esm/common/time.js.map +1 -1
- package/dist/esm/config/index.js +135 -18
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/contracts/notification-dispatch.js +1 -1
- package/dist/esm/database/db.js +32 -0
- package/dist/esm/database/db.js.map +1 -0
- package/dist/esm/database/index.js +9 -45
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/pagination.js +81 -0
- package/dist/esm/database/pagination.js.map +1 -0
- package/dist/esm/database/pool.js +51 -0
- package/dist/esm/database/pool.js.map +1 -0
- package/dist/esm/database/scoped-repository.js +128 -0
- package/dist/esm/database/scoped-repository.js.map +1 -0
- package/dist/esm/database/scopes.js +157 -0
- package/dist/esm/database/scopes.js.map +1 -0
- package/dist/esm/database/table-names.js +11 -0
- package/dist/esm/database/table-names.js.map +1 -0
- package/dist/esm/database/tables.js +61 -0
- package/dist/esm/database/tables.js.map +1 -0
- package/dist/esm/express/auth.js +62 -48
- package/dist/esm/express/auth.js.map +1 -1
- package/dist/esm/express/index.js +2 -0
- package/dist/esm/express/index.js.map +1 -1
- package/dist/esm/express/internal-caller.js +49 -0
- package/dist/esm/express/internal-caller.js.map +1 -0
- package/dist/esm/express/step-up.js +38 -0
- package/dist/esm/express/step-up.js.map +1 -0
- package/dist/esm/http/index.js +3 -70
- package/dist/esm/http/index.js.map +1 -1
- package/dist/esm/identity/index.js +246 -64
- package/dist/esm/identity/index.js.map +1 -1
- package/dist/esm/identity/step-up.js +47 -0
- package/dist/esm/identity/step-up.js.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/knex/columns.js +28 -0
- package/dist/esm/knex/columns.js.map +1 -0
- package/dist/esm/knex/index.js +8 -34
- package/dist/esm/knex/index.js.map +1 -1
- package/dist/esm/knex/migration-helpers.js +51 -0
- package/dist/esm/knex/migration-helpers.js.map +1 -0
- package/dist/esm/logging/redact.js +3 -7
- package/dist/esm/logging/redact.js.map +1 -1
- package/dist/esm/messaging/base-consumer.js +32 -0
- package/dist/esm/messaging/base-consumer.js.map +1 -0
- package/dist/esm/messaging/consumer.js +139 -71
- package/dist/esm/messaging/consumer.js.map +1 -1
- package/dist/esm/messaging/envelope.js +50 -10
- package/dist/esm/messaging/envelope.js.map +1 -1
- package/dist/esm/messaging/idempotency.js +91 -7
- package/dist/esm/messaging/idempotency.js.map +1 -1
- package/dist/esm/messaging/index.js +2 -1
- package/dist/esm/messaging/index.js.map +1 -1
- package/dist/esm/messaging/outbox.js +97 -54
- package/dist/esm/messaging/outbox.js.map +1 -1
- package/dist/esm/messaging/publisher.js +86 -38
- package/dist/esm/messaging/publisher.js.map +1 -1
- package/dist/esm/messaging/staff-notifier.js +4 -4
- package/dist/esm/messaging/staff-notifier.js.map +1 -1
- package/dist/esm/messaging/topology.js +39 -4
- package/dist/esm/messaging/topology.js.map +1 -1
- package/dist/esm/rate-limit/index.js +41 -6
- package/dist/esm/rate-limit/index.js.map +1 -1
- package/dist/esm/rate-limit/keys.js +43 -0
- package/dist/esm/rate-limit/keys.js.map +1 -0
- package/dist/esm/socket/index.js +112 -17
- package/dist/esm/socket/index.js.map +1 -1
- package/dist/esm/socket/ticket.js +117 -0
- package/dist/esm/socket/ticket.js.map +1 -0
- package/dist/esm/testing/index.js +24 -15
- package/dist/esm/testing/index.js.map +1 -1
- package/dist/types/access/index.d.ts +9 -3
- package/dist/types/access/index.d.ts.map +1 -1
- package/dist/types/approvals/index.d.ts +99 -0
- package/dist/types/approvals/index.d.ts.map +1 -0
- package/dist/types/audit/index.d.ts +82 -0
- package/dist/types/audit/index.d.ts.map +1 -0
- package/dist/types/cache/index.d.ts +64 -14
- package/dist/types/cache/index.d.ts.map +1 -1
- package/dist/types/cache/keyspace.d.ts +84 -0
- package/dist/types/cache/keyspace.d.ts.map +1 -0
- package/dist/types/common/circuit-breaker.d.ts +51 -0
- package/dist/types/common/circuit-breaker.d.ts.map +1 -0
- package/dist/types/common/index.d.ts +4 -0
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/internal-client.d.ts +116 -0
- package/dist/types/common/internal-client.d.ts.map +1 -0
- package/dist/types/common/internal-constants.d.ts +9 -0
- package/dist/types/common/internal-constants.d.ts.map +1 -0
- package/dist/types/common/internal-service-auth.d.ts +102 -0
- package/dist/types/common/internal-service-auth.d.ts.map +1 -0
- package/dist/types/common/money.d.ts +104 -0
- package/dist/types/common/money.d.ts.map +1 -0
- package/dist/types/common/phone.d.ts +25 -15
- package/dist/types/common/phone.d.ts.map +1 -1
- package/dist/types/common/time.d.ts +20 -2
- package/dist/types/common/time.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +251 -27
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/contracts/notification-dispatch.d.ts +13 -13
- package/dist/types/database/db.d.ts +46 -0
- package/dist/types/database/db.d.ts.map +1 -0
- package/dist/types/database/index.d.ts +9 -22
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/pagination.d.ts +68 -0
- package/dist/types/database/pagination.d.ts.map +1 -0
- package/dist/types/database/pool.d.ts +39 -0
- package/dist/types/database/pool.d.ts.map +1 -0
- package/dist/types/database/scoped-repository.d.ts +92 -0
- package/dist/types/database/scoped-repository.d.ts.map +1 -0
- package/dist/types/database/scopes.d.ts +159 -0
- package/dist/types/database/scopes.d.ts.map +1 -0
- package/dist/types/database/table-names.d.ts +13 -0
- package/dist/types/database/table-names.d.ts.map +1 -0
- package/dist/types/database/tables.d.ts +748 -0
- package/dist/types/database/tables.d.ts.map +1 -0
- package/dist/types/express/auth.d.ts +40 -24
- package/dist/types/express/auth.d.ts.map +1 -1
- package/dist/types/express/index.d.ts +2 -0
- package/dist/types/express/index.d.ts.map +1 -1
- package/dist/types/express/internal-caller.d.ts +53 -0
- package/dist/types/express/internal-caller.d.ts.map +1 -0
- package/dist/types/express/step-up.d.ts +38 -0
- package/dist/types/express/step-up.d.ts.map +1 -0
- package/dist/types/http/index.d.ts +3 -31
- package/dist/types/http/index.d.ts.map +1 -1
- package/dist/types/identity/index.d.ts +159 -21
- package/dist/types/identity/index.d.ts.map +1 -1
- package/dist/types/identity/step-up.d.ts +41 -0
- package/dist/types/identity/step-up.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/knex/columns.d.ts +15 -0
- package/dist/types/knex/columns.d.ts.map +1 -0
- package/dist/types/knex/index.d.ts +3 -11
- package/dist/types/knex/index.d.ts.map +1 -1
- package/dist/types/knex/migration-helpers.d.ts +28 -0
- package/dist/types/knex/migration-helpers.d.ts.map +1 -0
- package/dist/types/logging/redact.d.ts +2 -2
- package/dist/types/logging/redact.d.ts.map +1 -1
- package/dist/types/messaging/base-consumer.d.ts +33 -0
- package/dist/types/messaging/base-consumer.d.ts.map +1 -0
- package/dist/types/messaging/consumer.d.ts +59 -21
- package/dist/types/messaging/consumer.d.ts.map +1 -1
- package/dist/types/messaging/envelope.d.ts +50 -11
- package/dist/types/messaging/envelope.d.ts.map +1 -1
- package/dist/types/messaging/idempotency.d.ts +60 -3
- package/dist/types/messaging/idempotency.d.ts.map +1 -1
- package/dist/types/messaging/index.d.ts +7 -0
- package/dist/types/messaging/index.d.ts.map +1 -1
- package/dist/types/messaging/outbox.d.ts +62 -22
- package/dist/types/messaging/outbox.d.ts.map +1 -1
- package/dist/types/messaging/publisher.d.ts +54 -21
- package/dist/types/messaging/publisher.d.ts.map +1 -1
- package/dist/types/messaging/staff-notifier.d.ts +9 -9
- package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
- package/dist/types/messaging/staff-recipients.d.ts +1 -1
- package/dist/types/messaging/topology.d.ts +40 -8
- package/dist/types/messaging/topology.d.ts.map +1 -1
- package/dist/types/rate-limit/index.d.ts +40 -4
- package/dist/types/rate-limit/index.d.ts.map +1 -1
- package/dist/types/rate-limit/keys.d.ts +52 -0
- package/dist/types/rate-limit/keys.d.ts.map +1 -0
- package/dist/types/socket/index.d.ts +86 -2
- package/dist/types/socket/index.d.ts.map +1 -1
- package/dist/types/socket/ticket.d.ts +90 -0
- package/dist/types/socket/ticket.d.ts.map +1 -0
- package/dist/types/testing/index.d.ts +31 -10
- package/dist/types/testing/index.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +26 -14
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../src/database/tables.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAYhK,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;AAExI,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AACzD,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE3E,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,IAAI,SAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GActD;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,IAAI,SAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAUzE;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,IAAI,SAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAarE;AAED,4CAA4C;AAC5C,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAgB,CAAC;AACpC,gDAAgD;AAChD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAyB,CAAC;AACtD,8CAA8C;AAC9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAuB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { RequestHandler } from 'express';
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
import { type IdentityProtocol, type IdentityRejection } from '../identity/index.js';
|
|
2
3
|
import type { AuthUser, Logger } from '../types/index.js';
|
|
3
4
|
declare global {
|
|
4
5
|
namespace Express {
|
|
@@ -7,57 +8,72 @@ declare global {
|
|
|
7
8
|
}
|
|
8
9
|
}
|
|
9
10
|
}
|
|
11
|
+
/** Why a gateway identity was rejected, for the `onRejected` hook. */
|
|
12
|
+
export interface IdentityRejectedEvent {
|
|
13
|
+
reason: IdentityRejection;
|
|
14
|
+
method: string;
|
|
15
|
+
/** Request path without the query string. Never includes header values. */
|
|
16
|
+
path: string;
|
|
17
|
+
requestId?: string;
|
|
18
|
+
}
|
|
10
19
|
/** Options for the gateway identity middleware. */
|
|
11
20
|
export interface GatewayAuthOptions {
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
/**
|
|
21
|
+
/** The app's identity protocol (domain separator + header mapping). */
|
|
22
|
+
protocol: IdentityProtocol;
|
|
23
|
+
/** Shared HMAC secret; defaults to env `GATEWAY_SIGNING_SECRET`. Must be at least 32 characters (checked at startup). */
|
|
24
|
+
secret?: string;
|
|
25
|
+
/** Replay window for `x-gateway-ts` (default 30 s). */
|
|
26
|
+
maxAgeMs?: number;
|
|
27
|
+
/** Allowed gateway clock lead (default 5 s). */
|
|
28
|
+
maxFutureMs?: number;
|
|
29
|
+
/** Receives a warning (reason + path, no header values) when an identity is rejected. */
|
|
17
30
|
logger?: Logger;
|
|
31
|
+
/** Called on every rejected identity, e.g. to publish a security event. Errors it throws are logged and ignored. */
|
|
32
|
+
onRejected?: (event: IdentityRejectedEvent, req: Request) => void | Promise<void>;
|
|
18
33
|
}
|
|
19
34
|
/**
|
|
20
|
-
* Requires a valid gateway-signed identity and sets `req.user`; 401 UNAUTHENTICATED (with `requestId`)
|
|
35
|
+
* Requires a valid gateway-signed (v2) identity and sets `req.user`; 401 UNAUTHENTICATED (with `requestId`)
|
|
36
|
+
* otherwise. Also fills the request context's `userId` and `scopes` so log lines carry them.
|
|
37
|
+
* Throws at startup when the secret is missing or shorter than 32 characters.
|
|
21
38
|
*
|
|
22
|
-
* @param options
|
|
39
|
+
* @param options Protocol, secret, replay window, logger and rejection hook.
|
|
23
40
|
* @returns Express middleware.
|
|
24
|
-
* @example router.use(authenticateFromGateway({
|
|
41
|
+
* @example router.use(authenticateFromGateway({ protocol, logger, onRejected: publishSecurityEvent }));
|
|
25
42
|
*/
|
|
26
43
|
export declare function authenticateFromGateway(options: GatewayAuthOptions): RequestHandler;
|
|
27
44
|
/**
|
|
28
|
-
* Attaches `req.user` when a valid identity is present and continues anonymously when none is sent
|
|
29
|
-
* A forged or stale identity is still rejected with 401, never
|
|
45
|
+
* Attaches `req.user` when a valid identity is present and continues anonymously when none is sent,
|
|
46
|
+
* for public routes that personalise. A forged or stale identity is still rejected with 401, never
|
|
47
|
+
* downgraded to anonymous.
|
|
30
48
|
*
|
|
31
|
-
* @param options
|
|
49
|
+
* @param options Same as {@link authenticateFromGateway}.
|
|
32
50
|
* @returns Express middleware.
|
|
33
|
-
* @example router.get('/
|
|
51
|
+
* @example router.get('/items', optionalAuthFromGateway({ protocol }), controller.list);
|
|
34
52
|
*/
|
|
35
53
|
export declare function optionalAuthFromGateway(options: GatewayAuthOptions): RequestHandler;
|
|
36
54
|
/**
|
|
37
55
|
* Allows callers holding any of `permissions` (401 without identity, 403 FORBIDDEN otherwise).
|
|
56
|
+
* A super admin passes every permission guard.
|
|
38
57
|
*
|
|
39
58
|
* @example router.post('/refunds', requirePermission('refunds.create'), controller.create);
|
|
40
59
|
*/
|
|
41
60
|
export declare const requirePermission: (...permissions: string[]) => RequestHandler;
|
|
42
61
|
/**
|
|
43
|
-
* Allows callers holding every one of `permissions`.
|
|
62
|
+
* Allows callers holding every one of `permissions`. Accepts a list or rest arguments.
|
|
44
63
|
*
|
|
45
64
|
* @example router.delete('/x/:id', requireAllPermissions('x.read', 'x.delete'), controller.remove);
|
|
46
65
|
*/
|
|
47
|
-
export declare const requireAllPermissions: (...permissions: string[]) => RequestHandler;
|
|
66
|
+
export declare const requireAllPermissions: (...permissions: Array<string | string[]>) => RequestHandler;
|
|
48
67
|
/**
|
|
49
|
-
* Allows callers
|
|
68
|
+
* Allows callers whose session passed the one-time-code (second factor) check; 403 FORBIDDEN otherwise.
|
|
50
69
|
*
|
|
51
|
-
* @example router.
|
|
70
|
+
* @example router.post('/security/settings', requireOtpVerified(), controller.update);
|
|
52
71
|
*/
|
|
53
|
-
export declare const
|
|
72
|
+
export declare const requireOtpVerified: () => RequestHandler;
|
|
54
73
|
/**
|
|
55
|
-
*
|
|
56
|
-
* 401 UNAUTHENTICATED with `requestId` otherwise.
|
|
74
|
+
* Allows callers with any of `roles`. Prefer permissions; roles are for coarse gates only.
|
|
57
75
|
*
|
|
58
|
-
* @
|
|
59
|
-
* @returns Express middleware.
|
|
60
|
-
* @example router.use('/internal', requireInternalServiceSecret(config.internalSecret));
|
|
76
|
+
* @example router.use('/ops', requireRole('platform_admin'));
|
|
61
77
|
*/
|
|
62
|
-
export declare
|
|
78
|
+
export declare const requireRole: (...roles: string[]) => RequestHandler;
|
|
63
79
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/express/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/express/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAK/E,OAAO,EACsD,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EACzG,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE,QAAQ,CAAC;SACjB;KACF;CACF;AAED,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,yHAAyH;IACzH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oHAAoH;IACpH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAqCD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAMnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAMnF;AAaD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,GAAG,aAAa,MAAM,EAAE,KAAG,cAAgE,CAAC;AAE9H;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,GAAG,aAAa,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,KAAG,cAGhF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,cAAgG,CAAC;AAEvI;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,OAAO,MAAM,EAAE,KAAG,cAAyE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/express/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/express/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express guard for service-to-service routes.
|
|
3
|
+
*
|
|
4
|
+
* Layer: middleware. Key rules:
|
|
5
|
+
* - Every internal route names the exact callers it accepts: `requireInternalCaller(['alpha-service'])`.
|
|
6
|
+
* - 401 UNAUTHENTICATED when the caller name or secret is missing, unknown or wrong (constant-time compare);
|
|
7
|
+
* 403 FORBIDDEN when a correctly authenticated caller is not in the route's list.
|
|
8
|
+
* - 403 FORBIDDEN for any request outside the app's internal path prefix, so a guard mounted on a public
|
|
9
|
+
* router by mistake fails closed instead of exposing a credential-only route.
|
|
10
|
+
* - Rejections log the reason, caller name and path; never a secret or header value.
|
|
11
|
+
*/
|
|
12
|
+
import type { RequestHandler } from 'express';
|
|
13
|
+
import type { Logger } from '../types/index.js';
|
|
14
|
+
declare global {
|
|
15
|
+
namespace Express {
|
|
16
|
+
interface Request {
|
|
17
|
+
/** The authenticated calling service, set by `requireInternalCaller`. */
|
|
18
|
+
internalCaller?: string;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Settings for {@link createInternalCallerGuards}. */
|
|
23
|
+
export interface InternalCallerGuardOptions {
|
|
24
|
+
/** The app's internal route prefix, e.g. `/internal`; requests outside it are refused. */
|
|
25
|
+
pathPrefix: string;
|
|
26
|
+
/** Caller name → accepted secret; defaults to env `INTERNAL_SERVICE_CREDENTIALS`. */
|
|
27
|
+
credentials?: Readonly<Record<string, string>>;
|
|
28
|
+
/** Receives a warning per rejected call. */
|
|
29
|
+
logger?: Logger;
|
|
30
|
+
}
|
|
31
|
+
/** Guards built by {@link createInternalCallerGuards}. */
|
|
32
|
+
export interface InternalCallerGuards {
|
|
33
|
+
/**
|
|
34
|
+
* Allows only the listed callers.
|
|
35
|
+
*
|
|
36
|
+
* @param allowed Exact caller service names; must not be empty.
|
|
37
|
+
* @returns Express middleware that sets `req.internalCaller`.
|
|
38
|
+
* @throws Error at startup when `allowed` is empty.
|
|
39
|
+
*/
|
|
40
|
+
requireInternalCaller(allowed: readonly string[]): RequestHandler;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the internal-caller guard for a service, bound to its internal path prefix and accepted credentials.
|
|
44
|
+
*
|
|
45
|
+
* @param options Path prefix, credentials and logger.
|
|
46
|
+
* @returns `{ requireInternalCaller }`.
|
|
47
|
+
* @throws Error when the prefix is not an absolute path; ConfigError when env credentials are malformed.
|
|
48
|
+
* @example
|
|
49
|
+
* const { requireInternalCaller } = createInternalCallerGuards({ pathPrefix: '/internal', logger });
|
|
50
|
+
* router.get('/internal/records/:id', requireInternalCaller(['alpha-service']), controller.get);
|
|
51
|
+
*/
|
|
52
|
+
export declare function createInternalCallerGuards(options: InternalCallerGuardOptions): InternalCallerGuards;
|
|
53
|
+
//# sourceMappingURL=internal-caller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-caller.d.ts","sourceRoot":"","sources":["../../../src/express/internal-caller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAI/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,yEAAyE;YACzE,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB;KACF;CACF;AAED,uDAAuD;AACvD,MAAM,WAAW,0BAA0B;IACzC,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,qBAAqB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAAC;CACnE;AAID;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,GAAG,oBAAoB,CA+BpG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import { type StepUpCatalogue } from '../identity/step-up.js';
|
|
3
|
+
/** One step-up guard a service mounted, as listed by `declaredStepUpRoutes()`. */
|
|
4
|
+
export interface DeclaredStepUpRoute<S extends string = string> {
|
|
5
|
+
scope: S;
|
|
6
|
+
singleUse: boolean;
|
|
7
|
+
/** Route label such as `POST /v1/refunds/:id`, when the caller gave one. */
|
|
8
|
+
route?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Options for {@link createStepUpGuards}. */
|
|
11
|
+
export interface StepUpGuardOptions<S extends string> {
|
|
12
|
+
/** The app's scope catalogue from `defineStepUpScopes`. */
|
|
13
|
+
catalogue: StepUpCatalogue<S>;
|
|
14
|
+
/** How old a step-up may be (default 5 minutes). */
|
|
15
|
+
windowMs?: number;
|
|
16
|
+
/** Clock for tests. */
|
|
17
|
+
now?: () => number;
|
|
18
|
+
}
|
|
19
|
+
/** The guard factory and its registry, from {@link createStepUpGuards}. */
|
|
20
|
+
export interface StepUpGuards<S extends string> {
|
|
21
|
+
/** Middleware: 403 STEP_UP_REQUIRED `{ scope }` unless the gateway-verified step-up time is fresh. */
|
|
22
|
+
requireStepUp(scope: S, route?: string): RequestHandler;
|
|
23
|
+
/** Every guard created so far, so the service can compare its scopes with the gateway route map. */
|
|
24
|
+
declaredStepUpRoutes(): ReadonlyArray<DeclaredStepUpRoute<S>>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Builds the step-up guard for an app's catalogue. Must run after `authenticateFromGateway`, which sets
|
|
28
|
+
* `req.user.stepUpAt` only from the signed `x-step-up-at` header. Single-use proofs are consumed by the
|
|
29
|
+
* gateway; the service sees only the verified time. Throws at startup for an unknown scope or a bad window.
|
|
30
|
+
*
|
|
31
|
+
* @param options Catalogue, freshness window and clock.
|
|
32
|
+
* @returns `requireStepUp(scope, route?)` and `declaredStepUpRoutes()`.
|
|
33
|
+
* @example
|
|
34
|
+
* const { requireStepUp } = createStepUpGuards({ catalogue: stepUpScopes });
|
|
35
|
+
* router.post('/refunds/:id', requirePermission('refunds.create'), requireStepUp('refund-large', 'POST /refunds/:id'), controller.refund);
|
|
36
|
+
*/
|
|
37
|
+
export declare function createStepUpGuards<S extends string>(options: StepUpGuardOptions<S>): StepUpGuards<S>;
|
|
38
|
+
//# sourceMappingURL=step-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-up.d.ts","sourceRoot":"","sources":["../../../src/express/step-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAE/E,OAAO,EAC2D,KAAK,eAAe,EACrF,MAAM,wBAAwB,CAAC;AAGhC,kFAAkF;AAClF,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC5D,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,2DAA2D;IAC3D,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC5C,sGAAsG;IACtG,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IACxD,oGAAoG;IACpG,oBAAoB,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAqBpG"}
|
|
@@ -1,34 +1,6 @@
|
|
|
1
|
-
import type { Logger } from '../types/index.js';
|
|
2
|
-
export * from './safe-fetch.js';
|
|
3
|
-
export interface ServiceClientOptions {
|
|
4
|
-
/** e.g. `http://auth-admin-service:4001` */
|
|
5
|
-
baseUrl: string;
|
|
6
|
-
/** Sent as `x-internal-service-secret`. */
|
|
7
|
-
internalSecret: string;
|
|
8
|
-
callerService: string;
|
|
9
|
-
timeoutMs?: number;
|
|
10
|
-
/** Retries for network errors and 502/503/504 on idempotent methods. */
|
|
11
|
-
retries?: number;
|
|
12
|
-
logger?: Logger;
|
|
13
|
-
}
|
|
14
|
-
export interface RequestOptions {
|
|
15
|
-
query?: Record<string, string | number | boolean | undefined>;
|
|
16
|
-
body?: unknown;
|
|
17
|
-
headers?: Record<string, string>;
|
|
18
|
-
correlationId?: string;
|
|
19
|
-
timeoutMs?: number;
|
|
20
|
-
}
|
|
21
|
-
export interface ServiceClient {
|
|
22
|
-
get<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
23
|
-
post<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
24
|
-
put<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
25
|
-
patch<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
26
|
-
delete<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
27
|
-
}
|
|
28
1
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* and timeouts into 503s.
|
|
2
|
+
* Outbound HTTP helpers. Service-to-service calls use `createInternalClient` (root export); calls to
|
|
3
|
+
* tenant-supplied URLs go through the SSRF-guarded {@link createSafeFetcher}.
|
|
32
4
|
*/
|
|
33
|
-
export
|
|
5
|
+
export * from './safe-fetch.js';
|
|
34
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,iBAAiB,CAAC"}
|
|
@@ -1,51 +1,189 @@
|
|
|
1
1
|
import type { AuthUser } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Gateway identity protocol, version 2.
|
|
4
4
|
*
|
|
5
|
-
* The gateway strips
|
|
6
|
-
* `x-gateway-
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The gateway strips every client-supplied identity header, writes the headers below for the
|
|
6
|
+
* authenticated caller and signs them with `x-gateway-signature: v2=<hex>`. The signature is an
|
|
7
|
+
* HMAC-SHA256 over an app-chosen domain separator, the HTTP method, the canonical path (no query),
|
|
8
|
+
* the gateway timestamp and every identity header in a fixed order. A request that bypasses the
|
|
9
|
+
* gateway, is replayed later, or is replayed against another route cannot carry a forged identity.
|
|
10
|
+
*
|
|
11
|
+
* App-specific identity fields (for example a tenant id) travel in their own headers through an
|
|
12
|
+
* {@link IdentityProtocol} mapping, so this module never names an app concept.
|
|
9
13
|
*/
|
|
10
14
|
export declare const IDENTITY_HEADERS: {
|
|
11
15
|
readonly USER_ID: "x-user-id";
|
|
12
16
|
readonly USER_EMAIL: "x-user-email";
|
|
13
17
|
readonly USER_ROLES: "x-user-roles";
|
|
14
18
|
readonly USER_PERMISSIONS: "x-user-permissions";
|
|
19
|
+
readonly SUPER_ADMIN: "x-is-superadmin";
|
|
20
|
+
readonly OTP_VERIFIED: "x-otp-verified";
|
|
21
|
+
readonly STEP_UP_AT: "x-step-up-at";
|
|
22
|
+
readonly SESSION_ID: "x-session-id";
|
|
15
23
|
readonly USER_SCOPES: "x-user-scopes";
|
|
16
24
|
readonly USER_ATTRS: "x-user-attrs";
|
|
17
|
-
readonly SESSION_ID: "x-session-id";
|
|
18
25
|
readonly TIMESTAMP: "x-gateway-ts";
|
|
19
|
-
readonly SIGNATURE: "x-gateway-
|
|
26
|
+
readonly SIGNATURE: "x-gateway-signature";
|
|
20
27
|
};
|
|
28
|
+
/** Non-identity request headers shared by the gateway and services (correlation, client hints, internal auth). */
|
|
21
29
|
export declare const CONTEXT_HEADERS: {
|
|
22
30
|
readonly CORRELATION_ID: "x-correlation-id";
|
|
23
31
|
readonly ANON_ID: "x-anon-id";
|
|
24
32
|
readonly TIMEZONE: "x-timezone";
|
|
25
33
|
readonly CLIENT_IP: "x-client-ip";
|
|
26
34
|
readonly INTERNAL_SECRET: "x-internal-service-secret";
|
|
27
|
-
readonly
|
|
35
|
+
readonly INTERNAL_SERVICE_NAME: "x-internal-service-name";
|
|
36
|
+
readonly IDEMPOTENCY_KEY: "idempotency-key";
|
|
28
37
|
};
|
|
29
|
-
/**
|
|
30
|
-
export declare const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
/** Signature version prefix: `x-gateway-signature: v2=<hex>`. */
|
|
39
|
+
export declare const GATEWAY_SIGNATURE_VERSION = "v2";
|
|
40
|
+
/** Default maximum age of a gateway timestamp (replay window). */
|
|
41
|
+
export declare const DEFAULT_IDENTITY_MAX_AGE_MS = 30000;
|
|
42
|
+
/** Default allowance for a gateway clock that runs ahead of the service clock. */
|
|
43
|
+
export declare const DEFAULT_IDENTITY_MAX_FUTURE_MS = 5000;
|
|
44
|
+
/** Minimum length of the shared gateway signing secret. */
|
|
45
|
+
export declare const MIN_GATEWAY_SECRET_LENGTH = 32;
|
|
46
|
+
/** App binding of the identity protocol: domain separator plus app-specific identity headers. */
|
|
47
|
+
export interface IdentityProtocolInput {
|
|
48
|
+
/** Domain separator mixed into every signature, e.g. `"<app>-gateway-identity:v2"`. Two apps never verify each other. */
|
|
49
|
+
domain: string;
|
|
50
|
+
/** Scope key → header carrying that scope's ids (comma-separated). Signed after the email header, in declaration order. */
|
|
51
|
+
scopeHeaders?: Readonly<Record<string, string>>;
|
|
52
|
+
/** Attr key → header carrying that string attribute. Signed after the scope headers, in declaration order. */
|
|
53
|
+
attrHeaders?: Readonly<Record<string, string>>;
|
|
54
|
+
}
|
|
55
|
+
/** A validated identity protocol. Build it once with {@link defineIdentityProtocol}. */
|
|
56
|
+
export interface IdentityProtocol {
|
|
57
|
+
readonly domain: string;
|
|
58
|
+
readonly scopeHeaders: Readonly<Record<string, string>>;
|
|
59
|
+
readonly attrHeaders: Readonly<Record<string, string>>;
|
|
60
|
+
/** Every identity header in signing order (excludes the timestamp and signature headers). */
|
|
61
|
+
readonly headerOrder: readonly string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validates and freezes an app's identity protocol. Throws at startup on a bad binding so a
|
|
65
|
+
* misconfiguration can never weaken verification at runtime.
|
|
66
|
+
*
|
|
67
|
+
* @param input Domain separator and optional scope/attr header mappings.
|
|
68
|
+
* @returns The frozen protocol, including the signing order.
|
|
69
|
+
* @example const protocol = defineIdentityProtocol({ domain: 'shop-gateway-identity:v2', scopeHeaders: { tenant: 'x-tenant-id' } });
|
|
70
|
+
*/
|
|
71
|
+
export declare function defineIdentityProtocol(input: IdentityProtocolInput): IdentityProtocol;
|
|
72
|
+
/**
|
|
73
|
+
* Every header a client must never be allowed to set, for a given protocol: identity headers, the gateway
|
|
74
|
+
* timestamp and signature, both internal-service headers and the client IP.
|
|
75
|
+
*
|
|
76
|
+
* @param protocol The app's identity protocol.
|
|
77
|
+
* @returns Lower-case header names.
|
|
78
|
+
* @example const blocked = new Set(protectedHeaders(protocol));
|
|
79
|
+
*/
|
|
80
|
+
export declare function protectedHeaders(protocol: IdentityProtocol): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Removes every protected header in place (gateway ingress), so clients can't forge identity or internal auth.
|
|
83
|
+
*
|
|
84
|
+
* @param headers Incoming request headers (mutated).
|
|
85
|
+
* @param protocol The app's identity protocol.
|
|
86
|
+
* @example stripProtectedHeaders(req.headers, protocol);
|
|
87
|
+
*/
|
|
88
|
+
export declare function stripProtectedHeaders(headers: HeaderBag, protocol: IdentityProtocol): void;
|
|
89
|
+
/** Node-style request headers (lower-case names; repeated headers as arrays). */
|
|
90
|
+
export type HeaderBag = Record<string, string | string[] | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Canonical request path for signing: the path only (query and fragment dropped), always starting with `/`.
|
|
93
|
+
*
|
|
94
|
+
* @param path A path or path-plus-query such as `req.originalUrl`.
|
|
95
|
+
* @returns The path to sign or verify.
|
|
96
|
+
* @example canonicalPath('/v1/items?page=2') // '/v1/items'
|
|
97
|
+
*/
|
|
98
|
+
export declare function canonicalPath(path: string): string;
|
|
99
|
+
/**
|
|
100
|
+
* Gateway side: the identity header values (unsigned) that represent `user` under `protocol`.
|
|
101
|
+
* Mapped scopes and string attrs travel in their own headers; the rest go in the JSON headers.
|
|
102
|
+
*
|
|
103
|
+
* @param user The authenticated caller.
|
|
104
|
+
* @param protocol The app's identity protocol.
|
|
105
|
+
* @returns Header name → value for every header in `protocol.headerOrder`.
|
|
106
|
+
* @example const identity = buildIdentityHeaders(user, protocol);
|
|
107
|
+
*/
|
|
108
|
+
export declare function buildIdentityHeaders(user: AuthUser, protocol: IdentityProtocol): Record<string, string>;
|
|
109
|
+
/** Inputs to {@link signGatewayIdentity}. */
|
|
110
|
+
export interface SignGatewayIdentityInput {
|
|
111
|
+
method: string;
|
|
112
|
+
/** Path the downstream service will see; any query string is ignored. */
|
|
113
|
+
path: string;
|
|
114
|
+
/** Identity header values, e.g. from {@link buildIdentityHeaders}. Missing headers sign as empty. */
|
|
115
|
+
identity: Record<string, string>;
|
|
116
|
+
/** Gateway timestamp, epoch milliseconds (sent as `x-gateway-ts`). */
|
|
117
|
+
ts: number;
|
|
118
|
+
secret: string;
|
|
119
|
+
protocol: IdentityProtocol;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Signs an identity for one request.
|
|
123
|
+
*
|
|
124
|
+
* @param input Method, path, identity headers, timestamp, secret and protocol.
|
|
125
|
+
* @returns The `x-gateway-signature` value, `v2=<hex>`.
|
|
126
|
+
* @example headers['x-gateway-signature'] = signGatewayIdentity({ method, path, identity, ts, secret, protocol });
|
|
127
|
+
*/
|
|
128
|
+
export declare function signGatewayIdentity(input: SignGatewayIdentityInput): string;
|
|
129
|
+
/** Inputs to {@link signedIdentityHeaders}. */
|
|
130
|
+
export interface SignedIdentityHeadersInput {
|
|
131
|
+
user: AuthUser;
|
|
132
|
+
method: string;
|
|
133
|
+
path: string;
|
|
134
|
+
secret: string;
|
|
135
|
+
protocol: IdentityProtocol;
|
|
136
|
+
/** Epoch milliseconds; defaults to now. */
|
|
137
|
+
now?: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Gateway side convenience: every identity header plus `x-gateway-ts` and `x-gateway-signature`. Also used by a
|
|
141
|
+
* service acting for a user to re-sign the identity for one internal call (signatures bind method and path).
|
|
142
|
+
*
|
|
143
|
+
* @param input User, method, path, secret, protocol and optional time.
|
|
144
|
+
* @returns Headers to add to the outgoing request.
|
|
145
|
+
*
|
|
146
|
+
* @example Object.assign(proxyHeaders, signedIdentityHeaders({ user, method: req.method, path: upstreamPath, secret, protocol }));
|
|
147
|
+
*/
|
|
148
|
+
export declare function signedIdentityHeaders(input: SignedIdentityHeadersInput): Record<string, string>;
|
|
149
|
+
/** Why {@link verifyGatewayIdentity} rejected an identity (logged and passed to `onRejected`; never header values). */
|
|
150
|
+
export type IdentityRejection = 'missing-signature' | 'bad-version' | 'bad-timestamp' | 'stale' | 'future' | 'bad-signature' | 'bad-payload';
|
|
34
151
|
export type IdentityResult = {
|
|
35
152
|
status: 'anonymous';
|
|
36
153
|
} | {
|
|
37
154
|
status: 'invalid';
|
|
38
|
-
reason:
|
|
155
|
+
reason: IdentityRejection;
|
|
39
156
|
} | {
|
|
40
157
|
status: 'authenticated';
|
|
41
158
|
user: AuthUser;
|
|
42
159
|
};
|
|
43
|
-
/**
|
|
44
|
-
export
|
|
45
|
-
|
|
160
|
+
/** Inputs to {@link verifyGatewayIdentity}. */
|
|
161
|
+
export interface VerifyGatewayIdentityInput {
|
|
162
|
+
headers: HeaderBag;
|
|
163
|
+
method: string;
|
|
164
|
+
/** The path as received, e.g. `req.originalUrl`; the query is ignored. */
|
|
165
|
+
path: string;
|
|
166
|
+
secret: string;
|
|
167
|
+
protocol: IdentityProtocol;
|
|
46
168
|
now?: number;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
169
|
+
maxAgeMs?: number;
|
|
170
|
+
maxFutureMs?: number;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Service side: verifies and decodes the gateway identity. No `x-user-id` → anonymous. Otherwise the
|
|
174
|
+
* request is rejected unless the signature is present, version `v2`, made for this method, path and
|
|
175
|
+
* protocol, and the timestamp is at most `maxAgeMs` old (default 30 s) and at most `maxFutureMs` ahead
|
|
176
|
+
* (default 5 s). The comparison is constant-time.
|
|
177
|
+
*
|
|
178
|
+
* @example const result = verifyGatewayIdentity({ headers: req.headers, method: req.method, path: req.originalUrl, secret, protocol });
|
|
179
|
+
*/
|
|
180
|
+
export declare function verifyGatewayIdentity(input: VerifyGatewayIdentityInput): IdentityResult;
|
|
181
|
+
/**
|
|
182
|
+
* Throws unless `secret` is long enough to sign identities. Call at startup.
|
|
183
|
+
*
|
|
184
|
+
* @param secret The shared gateway signing secret (env `GATEWAY_SIGNING_SECRET`).
|
|
185
|
+
* @returns The secret, unchanged.
|
|
186
|
+
*/
|
|
187
|
+
export declare function assertGatewaySecret(secret: string | undefined): string;
|
|
188
|
+
export * from './step-up.js';
|
|
51
189
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step-up (re-authentication) scopes. The gateway checks the client's step-up proof for the route's
|
|
3
|
+
* scope and forwards the verified time as the signed `x-step-up-at` header; services only check that
|
|
4
|
+
* the time is fresh. Scope names and their rules are app values, declared once with
|
|
5
|
+
* {@link defineStepUpScopes}.
|
|
6
|
+
*/
|
|
7
|
+
/** Rules for one step-up scope. */
|
|
8
|
+
export interface StepUpScopeDefinition {
|
|
9
|
+
/** The step-up proof may be used for one request only (the gateway consumes it). */
|
|
10
|
+
singleUse?: boolean;
|
|
11
|
+
/** Short note for docs and the route registry. */
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
/** A frozen scope catalogue, keyed by scope name. */
|
|
15
|
+
export type StepUpCatalogue<S extends string = string> = Readonly<Record<S, Readonly<StepUpScopeDefinition>>>;
|
|
16
|
+
/** Default freshness window for a step-up verification. */
|
|
17
|
+
export declare const DEFAULT_STEP_UP_WINDOW_MS: number;
|
|
18
|
+
/** A step-up time this far ahead of the service clock is still accepted (clock skew). */
|
|
19
|
+
export declare const STEP_UP_MAX_FUTURE_MS = 5000;
|
|
20
|
+
/** Error code of the 403 a service returns when a fresh step-up is required. */
|
|
21
|
+
export declare const STEP_UP_REQUIRED_CODE = "STEP_UP_REQUIRED";
|
|
22
|
+
/**
|
|
23
|
+
* Validates and freezes an app's step-up scope catalogue (kebab-case names). Throws at startup on a bad name.
|
|
24
|
+
*
|
|
25
|
+
* @param catalogue Scope name → rules.
|
|
26
|
+
* @returns The frozen catalogue; its keys type `requireStepUp`'s scope argument.
|
|
27
|
+
* @example export const stepUpScopes = defineStepUpScopes({ 'refund-large': {}, 'payout-destination': { singleUse: true } });
|
|
28
|
+
*/
|
|
29
|
+
export declare function defineStepUpScopes<S extends string>(catalogue: Record<S, StepUpScopeDefinition>): StepUpCatalogue<S>;
|
|
30
|
+
export type StepUpStatus = 'fresh' | 'missing' | 'stale' | 'future';
|
|
31
|
+
/**
|
|
32
|
+
* Whether a gateway-verified step-up time is usable now.
|
|
33
|
+
*
|
|
34
|
+
* @param stepUpAt Epoch milliseconds of the step-up, or undefined when none was made.
|
|
35
|
+
* @param windowMs How old the step-up may be.
|
|
36
|
+
* @param now Current epoch milliseconds.
|
|
37
|
+
* @returns `fresh` when usable; otherwise why not.
|
|
38
|
+
* @example stepUpStatus(req.user?.stepUpAt, DEFAULT_STEP_UP_WINDOW_MS) === 'fresh'
|
|
39
|
+
*/
|
|
40
|
+
export declare function stepUpStatus(stepUpAt: number | undefined, windowMs: number, now?: number): StepUpStatus;
|
|
41
|
+
//# sourceMappingURL=step-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-up.d.ts","sourceRoot":"","sources":["../../../src/identity/step-up.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mCAAmC;AACnC,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAE9G,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,QAAa,CAAC;AACpD,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAIxD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAOpH;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,YAAY,CAInH"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ export * from './access/index.js';
|
|
|
6
6
|
export * from './validation/index.js';
|
|
7
7
|
export * from './logging/index.js';
|
|
8
8
|
export * from './config/index.js';
|
|
9
|
+
export * from './cache/keyspace.js';
|
|
10
|
+
export * from './rate-limit/keys.js';
|
|
9
11
|
export * from './contracts/index.js';
|
|
10
12
|
export * from './alerting/index.js';
|
|
13
|
+
export * from './database/pagination.js';
|
|
14
|
+
export * from './audit/index.js';
|
|
15
|
+
export * from './approvals/index.js';
|
|
16
|
+
export * from './socket/ticket.js';
|
|
11
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/** Column primitives shared by every migration helper (one definition of ULID and DATETIME(3) columns). */
|
|
3
|
+
/** `id CHAR(26)` primary key for ULIDs. */
|
|
4
|
+
export declare function ulidPrimary(table: Knex.CreateTableBuilder, name?: string): void;
|
|
5
|
+
/** `CHAR(26)` column referencing another ULID (FK constraints only within the same database). */
|
|
6
|
+
export declare function ulidColumn(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
7
|
+
/** `created_at` / `updated_at` as `DATETIME(3)` in UTC, maintained by MySQL. */
|
|
8
|
+
export declare function timestamps(table: Knex.CreateTableBuilder, knex: Knex): void;
|
|
9
|
+
/** `created_by` / `updated_by` actor columns (null for system operations). */
|
|
10
|
+
export declare function actorColumns(table: Knex.CreateTableBuilder): void;
|
|
11
|
+
/** Nullable `DATETIME(3)` column. */
|
|
12
|
+
export declare function datetime(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
13
|
+
/** `DATETIME(3)` column defaulting to `CURRENT_TIMESTAMP(3)` (insert time, UTC). */
|
|
14
|
+
export declare function createdAtColumn(table: Knex.CreateTableBuilder, knex: Knex, name?: string): Knex.ColumnBuilder;
|
|
15
|
+
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../../src/knex/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,2GAA2G;AAE3G,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,SAAO,GAAG,IAAI,CAE7E;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,aAAa,CAEpH;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAG3E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAGjE;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,aAAa,CAElH;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,SAAe,GAAG,IAAI,CAAC,aAAa,CAEnH"}
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import type { Knex } from 'knex';
|
|
2
|
+
export * from './columns.js';
|
|
3
|
+
export * from './migration-helpers.js';
|
|
2
4
|
/**
|
|
3
5
|
* Migration helpers (usable from CommonJS `.cjs` migrations via `require('@heavybit/shared-lib/knex')`).
|
|
4
6
|
* They keep ID, timestamp and audit column definitions identical across services.
|
|
5
7
|
*/
|
|
6
|
-
/** `id CHAR(26)` primary key for ULIDs. */
|
|
7
|
-
export declare function ulidPrimary(table: Knex.CreateTableBuilder, name?: string): void;
|
|
8
|
-
/** `CHAR(26)` column referencing another ULID (FK constraints only within the same database). */
|
|
9
|
-
export declare function ulidColumn(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
10
|
-
/** `created_at` / `updated_at` as `DATETIME(3)` in UTC, maintained by MySQL. */
|
|
11
|
-
export declare function timestamps(table: Knex.CreateTableBuilder, knex: Knex): void;
|
|
12
|
-
/** `created_by` / `updated_by` actor columns (null for system operations). */
|
|
13
|
-
export declare function actorColumns(table: Knex.CreateTableBuilder): void;
|
|
14
|
-
/** Nullable `DATETIME(3)` column. */
|
|
15
|
-
export declare function datetime(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
16
8
|
/**
|
|
17
9
|
* Creates `<parent>_audits`: every parent column (defined again by `columns`) plus `parent_id`
|
|
18
10
|
* and `action`. Audit rows are append-only history, so no unique constraints are copied.
|
|
19
11
|
*/
|
|
20
12
|
export declare function createAuditTable(knex: Knex, parentTable: string, columns: (table: Knex.CreateTableBuilder) => void): Promise<void>;
|
|
21
|
-
/** Transactional outbox table used by `OutboxRelay
|
|
13
|
+
/** Transactional outbox table used by `OutboxRelay` (columns from {@link outboxColumns}). */
|
|
22
14
|
export declare function createOutboxTable(knex: Knex, name?: string): Promise<void>;
|
|
23
15
|
/** Standard table options: InnoDB, utf8mb4. Call inside `createTable`. */
|
|
24
16
|
export declare function utf8mb4(table: Knex.CreateTableBuilder): void;
|