dbsc-toolkit 2.14.0 → 2.15.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/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +33 -15
- package/dist/client/index.js.map +1 -1
- package/dist/client/installFetchInterceptor.d.ts +2 -0
- package/dist/client/installFetchInterceptor.d.ts.map +1 -1
- package/dist/client/installFetchInterceptor.js +1 -0
- package/dist/client/installFetchInterceptor.js.map +1 -1
- package/dist/client/wrapFetch.d.ts +7 -0
- package/dist/client/wrapFetch.d.ts.map +1 -1
- package/dist/client/wrapFetch.js +4 -2
- package/dist/client/wrapFetch.js.map +1 -1
- package/dist/core/bound/proof.d.ts +7 -0
- package/dist/core/bound/proof.d.ts.map +1 -1
- package/dist/core/bound/proof.js +29 -3
- package/dist/core/bound/proof.js.map +1 -1
- package/dist/core/bound/registration.d.ts +8 -1
- package/dist/core/bound/registration.d.ts.map +1 -1
- package/dist/core/bound/registration.js +30 -11
- package/dist/core/bound/registration.js.map +1 -1
- package/dist/core/bound/verify.d.ts.map +1 -1
- package/dist/core/bound/verify.js +3 -0
- package/dist/core/bound/verify.js.map +1 -1
- package/dist/core/crypto/jwk.d.ts.map +1 -1
- package/dist/core/crypto/jwk.js +9 -0
- package/dist/core/crypto/jwk.js.map +1 -1
- package/dist/core/dpop/guard.d.ts +9 -0
- package/dist/core/dpop/guard.d.ts.map +1 -1
- package/dist/core/dpop/guard.js +18 -2
- package/dist/core/dpop/guard.js.map +1 -1
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +6 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +6 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/protect-policy.d.ts +30 -28
- package/dist/core/protect-policy.d.ts.map +1 -1
- package/dist/core/protect-policy.js +25 -0
- package/dist/core/protect-policy.js.map +1 -1
- package/dist/core/protocol/body.d.ts +9 -0
- package/dist/core/protocol/body.d.ts.map +1 -0
- package/dist/core/protocol/body.js +44 -0
- package/dist/core/protocol/body.js.map +1 -0
- package/dist/core/protocol/registration.d.ts.map +1 -1
- package/dist/core/protocol/registration.js +7 -5
- package/dist/core/protocol/registration.js.map +1 -1
- package/dist/core/protocol/start-binding.d.ts +16 -0
- package/dist/core/protocol/start-binding.d.ts.map +1 -0
- package/dist/core/protocol/start-binding.js +21 -0
- package/dist/core/protocol/start-binding.js.map +1 -0
- package/dist/core/types.d.ts +17 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/electron/index.d.ts +7 -0
- package/dist/electron/index.d.ts.map +1 -1
- package/dist/electron/index.js +13 -2
- package/dist/electron/index.js.map +1 -1
- package/dist/express/create-dbsc.d.ts +1 -1
- package/dist/express/create-dbsc.d.ts.map +1 -1
- package/dist/express/index.d.ts +0 -7
- package/dist/express/index.d.ts.map +1 -1
- package/dist/express/index.js +20 -23
- package/dist/express/index.js.map +1 -1
- package/dist/express/proof.d.ts +2 -0
- package/dist/express/proof.d.ts.map +1 -1
- package/dist/express/proof.js +8 -14
- package/dist/express/proof.js.map +1 -1
- package/dist/express/require-dpop.js +2 -1
- package/dist/express/require-dpop.js.map +1 -1
- package/dist/express/require-proof.d.ts +2 -2
- package/dist/express/require-proof.d.ts.map +1 -1
- package/dist/express/require-proof.js +8 -62
- package/dist/express/require-proof.js.map +1 -1
- package/dist/fastify/create-dbsc.d.ts +1 -1
- package/dist/fastify/create-dbsc.d.ts.map +1 -1
- package/dist/fastify/index.d.ts +0 -3
- package/dist/fastify/index.d.ts.map +1 -1
- package/dist/fastify/index.js +18 -23
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/proof.d.ts +2 -0
- package/dist/fastify/proof.d.ts.map +1 -1
- package/dist/fastify/proof.js +6 -14
- package/dist/fastify/proof.js.map +1 -1
- package/dist/fastify/require-dpop.d.ts.map +1 -1
- package/dist/fastify/require-dpop.js +1 -0
- package/dist/fastify/require-dpop.js.map +1 -1
- package/dist/fastify/require-proof.d.ts +2 -2
- package/dist/fastify/require-proof.d.ts.map +1 -1
- package/dist/fastify/require-proof.js +4 -43
- package/dist/fastify/require-proof.js.map +1 -1
- package/dist/hono/create-dbsc.d.ts +1 -1
- package/dist/hono/create-dbsc.d.ts.map +1 -1
- package/dist/hono/index.d.ts +0 -3
- package/dist/hono/index.d.ts.map +1 -1
- package/dist/hono/index.js +31 -29
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/proof.d.ts +2 -0
- package/dist/hono/proof.d.ts.map +1 -1
- package/dist/hono/proof.js +2 -2
- package/dist/hono/proof.js.map +1 -1
- package/dist/hono/require-dpop.d.ts.map +1 -1
- package/dist/hono/require-dpop.js +1 -0
- package/dist/hono/require-dpop.js.map +1 -1
- package/dist/hono/require-proof.d.ts +2 -2
- package/dist/hono/require-proof.d.ts.map +1 -1
- package/dist/hono/require-proof.js +4 -42
- package/dist/hono/require-proof.js.map +1 -1
- package/dist/koa/create-dbsc.d.ts +1 -1
- package/dist/koa/create-dbsc.d.ts.map +1 -1
- package/dist/koa/require-proof.d.ts +4 -2
- package/dist/koa/require-proof.d.ts.map +1 -1
- package/dist/koa/require-proof.js +21 -48
- package/dist/koa/require-proof.js.map +1 -1
- package/dist/nestjs/index.d.ts +1 -1
- package/dist/nestjs/index.d.ts.map +1 -1
- package/dist/nestjs/index.js +12 -50
- package/dist/nestjs/index.js.map +1 -1
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/index.js +37 -26
- package/dist/nextjs/index.js.map +1 -1
- package/dist/nextjs/proof.d.ts +2 -0
- package/dist/nextjs/proof.d.ts.map +1 -1
- package/dist/nextjs/proof.js +2 -2
- package/dist/nextjs/proof.js.map +1 -1
- package/dist/nextjs/require-dpop.d.ts.map +1 -1
- package/dist/nextjs/require-dpop.js +1 -0
- package/dist/nextjs/require-dpop.js.map +1 -1
- package/dist/nextjs/require-proof.d.ts +1 -1
- package/dist/nextjs/require-proof.d.ts.map +1 -1
- package/dist/nextjs/require-proof.js +12 -43
- package/dist/nextjs/require-proof.js.map +1 -1
- package/dist/node/create-dbsc.d.ts +1 -1
- package/dist/node/create-dbsc.d.ts.map +1 -1
- package/dist/node/index.d.ts +13 -4
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +45 -30
- package/dist/node/index.js.map +1 -1
- package/dist/node/require-dpop.d.ts.map +1 -1
- package/dist/node/require-dpop.js +1 -0
- package/dist/node/require-dpop.js.map +1 -1
- package/dist/node/require-proof.d.ts +3 -1
- package/dist/node/require-proof.d.ts.map +1 -1
- package/dist/node/require-proof.js +25 -58
- package/dist/node/require-proof.js.map +1 -1
- package/dist/storage/memory/index.d.ts +1 -1
- package/dist/storage/memory/index.d.ts.map +1 -1
- package/dist/storage/memory/index.js +7 -3
- package/dist/storage/memory/index.js.map +1 -1
- package/dist/storage/postgres/index.d.ts +7 -0
- package/dist/storage/postgres/index.d.ts.map +1 -1
- package/dist/storage/postgres/index.js +17 -1
- package/dist/storage/postgres/index.js.map +1 -1
- package/dist/storage/redis/index.d.ts +3 -0
- package/dist/storage/redis/index.d.ts.map +1 -1
- package/dist/storage/redis/index.js +31 -2
- package/dist/storage/redis/index.js.map +1 -1
- package/dist/sveltekit/index.d.ts +0 -3
- package/dist/sveltekit/index.d.ts.map +1 -1
- package/dist/sveltekit/index.js +31 -24
- package/dist/sveltekit/index.js.map +1 -1
- package/dist/sveltekit/require-dpop.d.ts.map +1 -1
- package/dist/sveltekit/require-dpop.js +1 -0
- package/dist/sveltekit/require-dpop.js.map +1 -1
- package/dist/sveltekit/require-proof.d.ts +3 -8
- package/dist/sveltekit/require-proof.d.ts.map +1 -1
- package/dist/sveltekit/require-proof.js +6 -62
- package/dist/sveltekit/require-proof.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/protocol/native-proof-guard.d.ts +0 -58
- package/dist/core/protocol/native-proof-guard.d.ts.map +0 -1
- package/dist/core/protocol/native-proof-guard.js +0 -60
- package/dist/core/protocol/native-proof-guard.js.map +0 -1
package/dist/core/dpop/guard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DbscVerificationError } from "../errors.js";
|
|
1
|
+
import { DbscVerificationError, ErrorCodes } from "../errors.js";
|
|
2
2
|
import { verifyDpopProof } from "./verify.js";
|
|
3
3
|
/** Parse a `DPoP <token>` Authorization header. Returns the token or undefined. */
|
|
4
4
|
export function parseDpopAuthorization(authorization) {
|
|
@@ -12,12 +12,28 @@ export function parseDpopAuthorization(authorization) {
|
|
|
12
12
|
* fields, calls this, then writes its own 401 + WWW-Authenticate on failure.
|
|
13
13
|
*/
|
|
14
14
|
export async function runDpopGuard(input) {
|
|
15
|
+
// A bearer token on a DPoP-guarded route is a downgrade: a stolen DPoP-bound
|
|
16
|
+
// token sent as Bearer with the thief's own proof would skip ath/jkt checks.
|
|
17
|
+
if (input.opts.requireTokenBinding !== false && /^bearer\s/i.test(input.authorization?.trim() ?? "")) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
error: {
|
|
21
|
+
code: ErrorCodes.DPOP_TOKEN_BINDING_REQUIRED,
|
|
22
|
+
message: "bearer token presented on a DPoP-guarded route; use the DPoP scheme",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
15
26
|
const accessToken = parseDpopAuthorization(input.authorization);
|
|
27
|
+
let url = input.url;
|
|
28
|
+
if (input.opts.origin) {
|
|
29
|
+
const actual = new URL(input.url, "http://x");
|
|
30
|
+
url = new URL(actual.pathname + actual.search, input.opts.origin).href;
|
|
31
|
+
}
|
|
16
32
|
try {
|
|
17
33
|
const { jkt } = await verifyDpopProof({
|
|
18
34
|
proof: input.proof,
|
|
19
35
|
method: input.method,
|
|
20
|
-
url
|
|
36
|
+
url,
|
|
21
37
|
...(accessToken !== undefined && { accessToken }),
|
|
22
38
|
...(input.boundJkt !== undefined && { boundJkt: input.boundJkt }),
|
|
23
39
|
...(input.opts.requireTokenBinding !== undefined && {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/core/dpop/guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/core/dpop/guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmD9C,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,aAAiC;IACtE,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB;IACtD,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrG,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,UAAU,CAAC,2BAA2B;gBAC5C,OAAO,EAAE,qEAAqE;aAC/E;SACF,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG;YACH,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,IAAI;gBAClD,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB;aACpD,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpF,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;SAC3E,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,iCAAiC,CAAC"}
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -25,10 +25,12 @@ export declare const ErrorCodes: {
|
|
|
25
25
|
readonly KEY_NOT_FOUND_BOUND: "KEY_NOT_FOUND_BOUND";
|
|
26
26
|
readonly SESSION_NOT_FOUND: "SESSION_NOT_FOUND";
|
|
27
27
|
readonly SESSION_ALREADY_REGISTERED: "SESSION_ALREADY_REGISTERED";
|
|
28
|
+
readonly REGISTRATION_WINDOW_CLOSED: "REGISTRATION_WINDOW_CLOSED";
|
|
28
29
|
readonly RATE_LIMITED: "RATE_LIMITED";
|
|
29
30
|
readonly MISSING_PROOF: "MISSING_PROOF";
|
|
30
31
|
readonly MALFORMED_PROOF: "MALFORMED_PROOF";
|
|
31
32
|
readonly PROOF_REPLAY: "PROOF_REPLAY";
|
|
33
|
+
readonly SESSION_MISMATCH: "SESSION_MISMATCH";
|
|
32
34
|
readonly DPOP_PROOF_MISSING: "DPOP_PROOF_MISSING";
|
|
33
35
|
readonly DPOP_PROOF_MALFORMED: "DPOP_PROOF_MALFORMED";
|
|
34
36
|
readonly DPOP_INVALID_TYP: "DPOP_INVALID_TYP";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Cb,CAAC"}
|
package/dist/core/errors.js
CHANGED
|
@@ -41,10 +41,16 @@ export const ErrorCodes = {
|
|
|
41
41
|
KEY_NOT_FOUND_BOUND: "KEY_NOT_FOUND_BOUND",
|
|
42
42
|
SESSION_NOT_FOUND: "SESSION_NOT_FOUND",
|
|
43
43
|
SESSION_ALREADY_REGISTERED: "SESSION_ALREADY_REGISTERED",
|
|
44
|
+
// A polyfill key arrived after the registration window closed (see
|
|
45
|
+
// DbscOptions.boundRegistrationWindowMs). The user has to sign in again.
|
|
46
|
+
REGISTRATION_WINDOW_CLOSED: "REGISTRATION_WINDOW_CLOSED",
|
|
44
47
|
RATE_LIMITED: "RATE_LIMITED",
|
|
45
48
|
MISSING_PROOF: "MISSING_PROOF",
|
|
46
49
|
MALFORMED_PROOF: "MALFORMED_PROOF",
|
|
47
50
|
PROOF_REPLAY: "PROOF_REPLAY",
|
|
51
|
+
// The DBSC session presented with the request is not the one bound to the
|
|
52
|
+
// app's own login (expectSessionId / expectUserId).
|
|
53
|
+
SESSION_MISMATCH: "SESSION_MISMATCH",
|
|
48
54
|
// DPoP (RFC 9449). Optional layer, reached only via the dbsc-toolkit/dpop
|
|
49
55
|
// subpath. A failed DPoP check maps to HTTP 401 + WWW-Authenticate: DPoP
|
|
50
56
|
// (resource-server semantics) — not the 403 the DBSC per-request proof uses.
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,gBAAgB;IAChB,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,0BAA0B,EAAE,4BAA4B;IACxD,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,0EAA0E;IAC1E,yEAAyE;IACzE,6EAA6E;IAC7E,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,2BAA2B,EAAE,6BAA6B;CAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,gBAAgB;IAChB,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,0BAA0B,EAAE,4BAA4B;IACxD,mEAAmE;IACnE,yEAAyE;IACzE,0BAA0B,EAAE,4BAA4B;IACxD,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,0EAA0E;IAC1E,oDAAoD;IACpD,gBAAgB,EAAE,kBAAkB;IACpC,0EAA0E;IAC1E,yEAAyE;IACzE,6EAA6E;IAC7E,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,2BAA2B,EAAE,6BAA6B;CAClD,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -7,12 +7,12 @@ export { buildRegistrationHeader, buildChallengeHeader, parseSessionResponseHead
|
|
|
7
7
|
export type { SkippedEntry, SkippedReason } from "./protocol/headers.js";
|
|
8
8
|
export { handleRegistration } from "./protocol/registration.js";
|
|
9
9
|
export { handleRefresh } from "./protocol/refresh.js";
|
|
10
|
-
export {
|
|
11
|
-
export type {
|
|
10
|
+
export { startBinding } from "./protocol/start-binding.js";
|
|
11
|
+
export type { StartBindingInput } from "./protocol/start-binding.js";
|
|
12
12
|
export { handleBoundRegistration } from "./bound/registration.js";
|
|
13
13
|
export { handleBoundRefresh } from "./bound/refresh.js";
|
|
14
14
|
export { verifyP256Signature } from "./bound/verify.js";
|
|
15
|
-
export { verifyBoundProof, parseProofHeader, BOUND_PROOF_HEADER } from "./bound/proof.js";
|
|
15
|
+
export { verifyBoundProof, parseProofHeader, proofBodyBytes, BOUND_PROOF_HEADER } from "./bound/proof.js";
|
|
16
16
|
export type { VerifyBoundProofRequest } from "./bound/proof.js";
|
|
17
17
|
export { NoopRateLimiter } from "./ratelimit/interface.js";
|
|
18
18
|
export { NoopReplayCache } from "./replay/interface.js";
|
|
@@ -20,9 +20,10 @@ export { emit } from "./telemetry/hooks.js";
|
|
|
20
20
|
export { maybeEmitPolyfillMissing, POLYFILL_MISSING_GRACE_MS } from "./telemetry/polyfill-missing.js";
|
|
21
21
|
export { deriveSessionId } from "./derive-session-id.js";
|
|
22
22
|
export type { DeriveSessionIdInput } from "./derive-session-id.js";
|
|
23
|
-
export { noBindingReason } from "./protect-policy.js";
|
|
24
|
-
export type { RequireProofOptions } from "./protect-policy.js";
|
|
23
|
+
export { noBindingReason, sessionBindingMatches, proofTarget, SESSION_MISMATCH_MESSAGE } from "./protect-policy.js";
|
|
24
|
+
export type { RequireProofOptions, SessionBindingHook } from "./protect-policy.js";
|
|
25
25
|
export { parseCookieHeader } from "./protocol/cookies.js";
|
|
26
|
+
export { readJsonObject, MAX_PROTOCOL_BODY_BYTES } from "./protocol/body.js";
|
|
26
27
|
export { resolveCookieScope, cookieNames as resolveCookieNames, deviceCookieName, cookieAttributesString, } from "./cookies/options.js";
|
|
27
28
|
export type { CookieScope, CookieScopeOptions, CookieScopeResolved } from "./cookies/options.js";
|
|
28
29
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1G,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpH,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -5,17 +5,18 @@ export { generateJti, issueChallenge } from "./protocol/challenge.js";
|
|
|
5
5
|
export { buildRegistrationHeader, buildChallengeHeader, parseSessionResponseHeader, parseSessionSkippedHeader, buildSessionIdCookie, readSessionResponseHeader, REGISTRATION_HEADER, RESPONSE_HEADER, CHALLENGE_HEADER, SKIPPED_HEADER, LEGACY_REGISTRATION_HEADER, LEGACY_RESPONSE_HEADER, LEGACY_CHALLENGE_HEADER, LEGACY_SKIPPED_HEADER, } from "./protocol/headers.js";
|
|
6
6
|
export { handleRegistration } from "./protocol/registration.js";
|
|
7
7
|
export { handleRefresh } from "./protocol/refresh.js";
|
|
8
|
-
export {
|
|
8
|
+
export { startBinding } from "./protocol/start-binding.js";
|
|
9
9
|
export { handleBoundRegistration } from "./bound/registration.js";
|
|
10
10
|
export { handleBoundRefresh } from "./bound/refresh.js";
|
|
11
11
|
export { verifyP256Signature } from "./bound/verify.js";
|
|
12
|
-
export { verifyBoundProof, parseProofHeader, BOUND_PROOF_HEADER } from "./bound/proof.js";
|
|
12
|
+
export { verifyBoundProof, parseProofHeader, proofBodyBytes, BOUND_PROOF_HEADER } from "./bound/proof.js";
|
|
13
13
|
export { NoopRateLimiter } from "./ratelimit/interface.js";
|
|
14
14
|
export { NoopReplayCache } from "./replay/interface.js";
|
|
15
15
|
export { emit } from "./telemetry/hooks.js";
|
|
16
16
|
export { maybeEmitPolyfillMissing, POLYFILL_MISSING_GRACE_MS } from "./telemetry/polyfill-missing.js";
|
|
17
17
|
export { deriveSessionId } from "./derive-session-id.js";
|
|
18
|
-
export { noBindingReason } from "./protect-policy.js";
|
|
18
|
+
export { noBindingReason, sessionBindingMatches, proofTarget, SESSION_MISMATCH_MESSAGE } from "./protect-policy.js";
|
|
19
19
|
export { parseCookieHeader } from "./protocol/cookies.js";
|
|
20
|
+
export { readJsonObject, MAX_PROTOCOL_BODY_BYTES } from "./protocol/body.js";
|
|
20
21
|
export { resolveCookieScope, cookieNames as resolveCookieNames, deviceCookieName, cookieAttributesString, } from "./cookies/options.js";
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG1G,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ProofReplayCache, StorageAdapter } from "./types.js";
|
|
2
2
|
import type { SkippedEntry } from "./protocol/headers.js";
|
|
3
|
-
import type { CookieScope } from "./cookies/options.js";
|
|
4
3
|
/**
|
|
5
4
|
* Options for `requireProof()`. All optional — `requireProof()` with no
|
|
6
5
|
* arguments is the normal call. `requireProof()` always means: the request
|
|
@@ -8,7 +7,9 @@ import type { CookieScope } from "./cookies/options.js";
|
|
|
8
7
|
* As of v2.7 Chromium sessions register a polyfill key alongside the TPM
|
|
9
8
|
* key, so the per-request signature works the same way on every tier.
|
|
10
9
|
*/
|
|
11
|
-
|
|
10
|
+
/** Returns the app's own value for this request, or nothing when there is no login. */
|
|
11
|
+
export type SessionBindingHook<Req> = (req: Req) => string | null | undefined | Promise<string | null | undefined>;
|
|
12
|
+
export interface RequireProofOptions<Req = unknown> {
|
|
12
13
|
/**
|
|
13
14
|
* Skip the per-request proof header on `tier: "dbsc"`. **Default `false`
|
|
14
15
|
* as of v2.7.** v2.6 and earlier defaulted to `true`, which left a
|
|
@@ -39,37 +40,38 @@ export interface RequireProofOptions {
|
|
|
39
40
|
*/
|
|
40
41
|
bound?: boolean;
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* The guard
|
|
45
|
-
*
|
|
46
|
-
* same URL with `Secure-Session-Response`, which the guard verifies against the
|
|
47
|
-
* stored native key. A stolen cookie has no hardware key, so it is rejected per
|
|
48
|
-
* request — closing the refresh-cycle replay window without the polyfill.
|
|
43
|
+
* Ties the device-bound session to the app's own login. Return the session
|
|
44
|
+
* id you passed to `bind()` for the user this request is authenticated as.
|
|
45
|
+
* The guard rejects with 403 `SESSION_MISMATCH` when it differs from the
|
|
46
|
+
* DBSC session on the request, or when it returns nothing.
|
|
49
47
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
*
|
|
48
|
+
* Without this (or `expectUserId`) the guard only proves the request came
|
|
49
|
+
* from *some* bound device: an attacker can pair a stolen app cookie with
|
|
50
|
+
* their own bound DBSC session and pass. Set one of the two on every route
|
|
51
|
+
* where the app identifies the user from a separate cookie or token.
|
|
52
|
+
*/
|
|
53
|
+
expectSessionId?: SessionBindingHook<Req>;
|
|
54
|
+
/**
|
|
55
|
+
* Like `expectSessionId`, but compares against the `userId` passed to
|
|
56
|
+
* `bind()`. Use it when the app has no stable session id (JWT mode).
|
|
59
57
|
*/
|
|
60
|
-
|
|
58
|
+
expectUserId?: SessionBindingHook<Req>;
|
|
61
59
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* shared context. Defaults to the secure `__Host-` scope.
|
|
60
|
+
* Verify the query string as part of the signed path (`/path?a=1`). Must
|
|
61
|
+
* match the client's `wrapFetch({ signQuery: true })`. Off by default: the
|
|
62
|
+
* proof then covers method, path and body but not the query, so a captured
|
|
63
|
+
* proof can be replayed with different query parameters inside the window.
|
|
67
64
|
*/
|
|
68
|
-
|
|
69
|
-
cookieDomain?: string;
|
|
70
|
-
/** Secure flag for the `freshProof` challenge cookie (Next.js only — others read context). Default true. */
|
|
71
|
-
secure?: boolean;
|
|
65
|
+
signQuery?: boolean;
|
|
72
66
|
}
|
|
67
|
+
/** The path string a proof signs: the pathname, plus the query when `signQuery` is on. */
|
|
68
|
+
export declare function proofTarget(pathname: string, search: string, signQuery: boolean | undefined): string;
|
|
69
|
+
export declare const SESSION_MISMATCH_MESSAGE = "device-bound session does not belong to this login";
|
|
70
|
+
/**
|
|
71
|
+
* Runs the `expectSessionId` / `expectUserId` hooks. Returns `true` when the
|
|
72
|
+
* DBSC session on the request belongs to the app's login (or no hook is set).
|
|
73
|
+
*/
|
|
74
|
+
export declare function sessionBindingMatches<Req>(opts: RequireProofOptions<Req>, req: Req, sessionId: string, storage: StorageAdapter): Promise<boolean>;
|
|
73
75
|
/** Human-readable reason for a `tier: "none"` rejection — quota-aware. */
|
|
74
76
|
export declare function noBindingReason(skipped?: SkippedEntry[]): string;
|
|
75
77
|
//# sourceMappingURL=protect-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protect-policy.d.ts","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"protect-policy.d.ts","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;GAMG;AACH,uFAAuF;AACvF,MAAM,MAAM,kBAAkB,CAAC,GAAG,IAAI,CACpC,GAAG,EAAE,GAAG,KACL,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,mBAAmB,CAAC,GAAG,GAAG,OAAO;IAChD;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAEpG;AAED,eAAO,MAAM,wBAAwB,uDAAuD,CAAC;AAE7F;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAC7C,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAC9B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,OAAO,GAAE,YAAY,EAAO,GAAG,MAAM,CAKpE"}
|
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
/** The path string a proof signs: the pathname, plus the query when `signQuery` is on. */
|
|
2
|
+
export function proofTarget(pathname, search, signQuery) {
|
|
3
|
+
return signQuery ? pathname + search : pathname;
|
|
4
|
+
}
|
|
5
|
+
export const SESSION_MISMATCH_MESSAGE = "device-bound session does not belong to this login";
|
|
6
|
+
/**
|
|
7
|
+
* Runs the `expectSessionId` / `expectUserId` hooks. Returns `true` when the
|
|
8
|
+
* DBSC session on the request belongs to the app's login (or no hook is set).
|
|
9
|
+
*/
|
|
10
|
+
export async function sessionBindingMatches(opts, req, sessionId, storage) {
|
|
11
|
+
if (opts.expectSessionId) {
|
|
12
|
+
const want = await opts.expectSessionId(req);
|
|
13
|
+
if (!want || want !== sessionId)
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (opts.expectUserId) {
|
|
17
|
+
const want = await opts.expectUserId(req);
|
|
18
|
+
if (!want)
|
|
19
|
+
return false;
|
|
20
|
+
const sess = await storage.getSession(sessionId);
|
|
21
|
+
if (!sess || sess.userId !== want)
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
1
26
|
/** Human-readable reason for a `tier: "none"` rejection — quota-aware. */
|
|
2
27
|
export function noBindingReason(skipped = []) {
|
|
3
28
|
if (skipped.some((s) => s.reason === "quota_exceeded")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protect-policy.js","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"protect-policy.js","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAuEA,0FAA0F;AAC1F,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAc,EAAE,SAA8B;IAC1F,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,oDAAoD,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA8B,EAC9B,GAAQ,EACR,SAAiB,EACjB,OAAuB;IAEvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,UAA0B,EAAE;IAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,EAAE,CAAC;QACvD,OAAO,yIAAyI,CAAC;IACnJ,CAAC;IACD,OAAO,oFAAoF,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Protocol request bodies are a key and a signature; anything larger is refused. */
|
|
2
|
+
export declare const MAX_PROTOCOL_BODY_BYTES: number;
|
|
3
|
+
/**
|
|
4
|
+
* Reads a Web `Request` body as a JSON object, stopping after `limit` bytes.
|
|
5
|
+
* Returns `{}` for an empty, oversized, invalid, or non-object body, so route
|
|
6
|
+
* code can read fields without guarding against `null` or arrays.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readJsonObject(request: Request, limit?: number): Promise<Record<string, unknown>>;
|
|
9
|
+
//# sourceMappingURL=body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/body.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,MAAgC,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BlC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Protocol request bodies are a key and a signature; anything larger is refused. */
|
|
2
|
+
export const MAX_PROTOCOL_BODY_BYTES = 16 * 1024;
|
|
3
|
+
/**
|
|
4
|
+
* Reads a Web `Request` body as a JSON object, stopping after `limit` bytes.
|
|
5
|
+
* Returns `{}` for an empty, oversized, invalid, or non-object body, so route
|
|
6
|
+
* code can read fields without guarding against `null` or arrays.
|
|
7
|
+
*/
|
|
8
|
+
export async function readJsonObject(request, limit = MAX_PROTOCOL_BODY_BYTES) {
|
|
9
|
+
const declared = Number(request.headers.get("content-length"));
|
|
10
|
+
if (Number.isFinite(declared) && declared > limit)
|
|
11
|
+
return {};
|
|
12
|
+
if (!request.body)
|
|
13
|
+
return {};
|
|
14
|
+
const reader = request.body.getReader();
|
|
15
|
+
const chunks = [];
|
|
16
|
+
let size = 0;
|
|
17
|
+
for (;;) {
|
|
18
|
+
const { done, value } = await reader.read();
|
|
19
|
+
if (done)
|
|
20
|
+
break;
|
|
21
|
+
size += value.byteLength;
|
|
22
|
+
if (size > limit) {
|
|
23
|
+
await reader.cancel().catch(() => { });
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
chunks.push(value);
|
|
27
|
+
}
|
|
28
|
+
const bytes = new Uint8Array(size);
|
|
29
|
+
let off = 0;
|
|
30
|
+
for (const c of chunks) {
|
|
31
|
+
bytes.set(c, off);
|
|
32
|
+
off += c.byteLength;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const parsed = JSON.parse(new TextDecoder().decode(bytes));
|
|
36
|
+
return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
|
|
37
|
+
? parsed
|
|
38
|
+
: {};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../src/core/protocol/body.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,QAAgB,uBAAuB;IAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,KAAK;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;QACzB,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClB,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseRegistrationJws } from "../crypto/jws.js";
|
|
2
2
|
import { DbscProtocolError, DbscVerificationError, ErrorCodes } from "../errors.js";
|
|
3
|
+
import { storeKeyOnce } from "../bound/registration.js";
|
|
3
4
|
export async function handleRegistration(req, storage) {
|
|
4
5
|
if (!req.secSessionResponseHeader) {
|
|
5
6
|
throw new DbscProtocolError(ErrorCodes.MISSING_RESPONSE_HEADER, "Secure-Session-Response header is required");
|
|
@@ -22,6 +23,10 @@ export async function handleRegistration(req, storage) {
|
|
|
22
23
|
if (challenge.sessionId !== req.sessionId) {
|
|
23
24
|
throw new DbscVerificationError(ErrorCodes.JTI_MISMATCH, "challenge does not belong to this session");
|
|
24
25
|
}
|
|
26
|
+
const session = await storage.getSession(req.sessionId);
|
|
27
|
+
if (!session) {
|
|
28
|
+
throw new DbscVerificationError(ErrorCodes.SESSION_NOT_FOUND, "session not found");
|
|
29
|
+
}
|
|
25
30
|
const existingKey = await storage.getBoundKey(req.sessionId, "native");
|
|
26
31
|
if (existingKey) {
|
|
27
32
|
throw new DbscVerificationError(ErrorCodes.SESSION_ALREADY_REGISTERED, "session already has a native bound key; cannot register again");
|
|
@@ -38,11 +43,8 @@ export async function handleRegistration(req, storage) {
|
|
|
38
43
|
createdAt: now,
|
|
39
44
|
algorithm,
|
|
40
45
|
};
|
|
41
|
-
await storage
|
|
42
|
-
|
|
43
|
-
if (session) {
|
|
44
|
-
await storage.setSession({ ...session, tier: "dbsc", lastRefreshAt: now });
|
|
45
|
-
}
|
|
46
|
+
await storeKeyOnce(storage, boundKey);
|
|
47
|
+
await storage.setSession({ ...session, tier: "dbsc", lastRefreshAt: now });
|
|
46
48
|
return { boundKey };
|
|
47
49
|
}
|
|
48
50
|
//# sourceMappingURL=registration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StorageAdapter } from "../types.js";
|
|
2
|
+
export interface StartBindingInput {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
userId: string;
|
|
5
|
+
sessionTtlMs: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Starts a fresh binding for a login: drops any keys left on this session id
|
|
9
|
+
* and resets the session row, so the registration window starts now and a new
|
|
10
|
+
* device key can register. Called by every adapter's `bindSession()`.
|
|
11
|
+
*
|
|
12
|
+
* Reusing an old row kept its keys, so a re-login on a deterministic session
|
|
13
|
+
* id (JWT mode) could never register the browser's new key.
|
|
14
|
+
*/
|
|
15
|
+
export declare function startBinding(storage: StorageAdapter, input: StartBindingInput): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=start-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-binding.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/start-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starts a fresh binding for a login: drops any keys left on this session id
|
|
3
|
+
* and resets the session row, so the registration window starts now and a new
|
|
4
|
+
* device key can register. Called by every adapter's `bindSession()`.
|
|
5
|
+
*
|
|
6
|
+
* Reusing an old row kept its keys, so a re-login on a deterministic session
|
|
7
|
+
* id (JWT mode) could never register the browser's new key.
|
|
8
|
+
*/
|
|
9
|
+
export async function startBinding(storage, input) {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
await storage.deleteBoundKey(input.sessionId);
|
|
12
|
+
await storage.setSession({
|
|
13
|
+
id: input.sessionId,
|
|
14
|
+
userId: input.userId,
|
|
15
|
+
tier: "none",
|
|
16
|
+
createdAt: now,
|
|
17
|
+
expiresAt: now + input.sessionTtlMs,
|
|
18
|
+
lastRefreshAt: 0,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=start-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-binding.js","sourceRoot":"","sources":["../../../src/core/protocol/start-binding.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,KAAwB;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,EAAE,EAAE,KAAK,CAAC,SAAS;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG,GAAG,KAAK,CAAC,YAAY;QACnC,aAAa,EAAE,CAAC;KACjB,CAAC,CAAC;AACL,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -59,6 +59,13 @@ export interface StorageAdapter {
|
|
|
59
59
|
*/
|
|
60
60
|
getBoundKey(sessionId: string, kind?: BoundKeyKind): Promise<BoundKey | null>;
|
|
61
61
|
setBoundKey(key: BoundKey): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Optional. Store `key` only if no key of the same kind exists for the
|
|
64
|
+
* session; return `false` when one already does. Registration uses it so two
|
|
65
|
+
* racing registrations cannot overwrite each other. Adapters without it fall
|
|
66
|
+
* back to a read-then-write.
|
|
67
|
+
*/
|
|
68
|
+
setBoundKeyIfAbsent?(key: BoundKey): Promise<boolean>;
|
|
62
69
|
/**
|
|
63
70
|
* Delete the bound key(s) for a session. Pass `kind` to remove just one
|
|
64
71
|
* slot; without `kind` both slots are removed.
|
|
@@ -155,6 +162,16 @@ export interface DbscOptions {
|
|
|
155
162
|
* Firefox / Safari then get no binding and `requireProof()` 403s them.
|
|
156
163
|
*/
|
|
157
164
|
bound?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* How long after the binding starts a polyfill (`bound`) key may still be
|
|
167
|
+
* registered, in ms. Default 300000 (5 min). The window starts when the
|
|
168
|
+
* native key registered (Chromium) or when `bind()` ran (other browsers).
|
|
169
|
+
*
|
|
170
|
+
* Without a window, anyone holding the session cookie could register their
|
|
171
|
+
* own polyfill key on a session that had none yet and pass `requireProof()`.
|
|
172
|
+
* A session that misses the window stays unbound until the next sign-in.
|
|
173
|
+
*/
|
|
174
|
+
boundRegistrationWindowMs?: number;
|
|
158
175
|
boundCookieTtl?: number;
|
|
159
176
|
registrationCookieTtl?: number;
|
|
160
177
|
/**
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC9E,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,mBAAmB,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACrD,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,cAAc,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,YAAY,GACZ,wBAAwB,GACxB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,CAAC;AAEzB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;OAQG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC;CACjF;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
package/dist/electron/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
1
2
|
import { type DbscNodeHandler, type DbscNodeSession } from "../node/index.js";
|
|
2
3
|
export { dbsc, bindSession, getDbscSession, readJsonBody, createDbsc, DBSC_INTERNAL, } from "../node/index.js";
|
|
3
4
|
export type { DbscNodeHandler, DbscNodeSession, DbscNodeOptions, DbscInternal, BindSessionOptions, } from "../node/index.js";
|
|
@@ -19,6 +20,12 @@ export { createElectronDbsc, type ElectronDbscKit } from "./create-dbsc.js";
|
|
|
19
20
|
export interface DbscProtocolResult {
|
|
20
21
|
handled: boolean;
|
|
21
22
|
response: Response;
|
|
23
|
+
/**
|
|
24
|
+
* Runs a node guard (`kit.requireProof()`, `kit.requireDpop()`) against this
|
|
25
|
+
* request. Resolves `null` when the guard lets the request through, or the
|
|
26
|
+
* guard's error `Response` to return instead.
|
|
27
|
+
*/
|
|
28
|
+
guard(g: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>): Promise<Response | null>;
|
|
22
29
|
session: DbscNodeSession | undefined;
|
|
23
30
|
}
|
|
24
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAwB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKpG,OAAO,EACL,IAAI,EACJ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpG,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC;CACtC;AAkFD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAiB7B"}
|
package/dist/electron/index.js
CHANGED
|
@@ -86,10 +86,21 @@ function makeRes() {
|
|
|
86
86
|
* primitive if you need the resolved session or to chain a guard.
|
|
87
87
|
*/
|
|
88
88
|
export async function handleDbscProtocol(request, handler) {
|
|
89
|
-
|
|
89
|
+
// Only buffer a body that can exist; GET/HEAD requests on the custom scheme
|
|
90
|
+
// (pages, assets) are not copied into memory.
|
|
91
|
+
const hasBody = request.method !== "GET" && request.method !== "HEAD";
|
|
92
|
+
const raw = hasBody ? new Uint8Array(await request.clone().arrayBuffer()) : new Uint8Array(0);
|
|
90
93
|
const req = makeReq(request, raw);
|
|
91
94
|
const { res, toResponse } = makeRes();
|
|
92
95
|
const handled = await handler(req, res);
|
|
93
|
-
return {
|
|
96
|
+
return {
|
|
97
|
+
handled,
|
|
98
|
+
response: toResponse(),
|
|
99
|
+
session: getDbscSession(req),
|
|
100
|
+
guard: async (g) => {
|
|
101
|
+
const out = makeRes();
|
|
102
|
+
return (await g(req, out.res)) ? null : out.toResponse();
|
|
103
|
+
},
|
|
104
|
+
};
|
|
94
105
|
}
|
|
95
106
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,cAAc,EAA8C,MAAM,kBAAkB,CAAC;AAEpG,kFAAkF;AAClF,iFAAiF;AACjF,+EAA+E;AAC/E,OAAO,EACL,IAAI,EACJ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAwB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"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"}
|