@kya-os/mcp-i-cloudflare 1.14.1 → 1.14.2
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/agent.d.ts.map +1 -1
- package/dist/agent.js +23 -5
- package/dist/agent.js.map +1 -1
- package/dist/audit/deployment-binding.d.ts +54 -54
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/delegation-http/anchor-do.d.ts.map +1 -1
- package/dist/delegation-http/anchor-do.js +108 -10
- package/dist/delegation-http/anchor-do.js.map +1 -1
- package/dist/delegation-http/anchor-registration-validate.d.ts +4 -0
- package/dist/delegation-http/anchor-registration-validate.d.ts.map +1 -1
- package/dist/delegation-http/anchor-registration-validate.js +9 -0
- package/dist/delegation-http/anchor-registration-validate.js.map +1 -1
- package/dist/delegation-http/anchor-registration.d.ts.map +1 -1
- package/dist/delegation-http/anchor-registration.js +119 -29
- package/dist/delegation-http/anchor-registration.js.map +1 -1
- package/dist/delegation-http/bearer-retry.d.ts +6 -14
- package/dist/delegation-http/bearer-retry.d.ts.map +1 -1
- package/dist/delegation-http/bearer-retry.js +37 -73
- package/dist/delegation-http/bearer-retry.js.map +1 -1
- package/dist/delegation-http/challenge.d.ts +4 -6
- package/dist/delegation-http/challenge.d.ts.map +1 -1
- package/dist/delegation-http/challenge.js +10 -8
- package/dist/delegation-http/challenge.js.map +1 -1
- package/dist/delegation-http/consent-anchor-bridge.d.ts +5 -8
- package/dist/delegation-http/consent-anchor-bridge.d.ts.map +1 -1
- package/dist/delegation-http/consent-anchor-bridge.js +236 -40
- package/dist/delegation-http/consent-anchor-bridge.js.map +1 -1
- package/dist/delegation-http/constants.d.ts +2 -0
- package/dist/delegation-http/constants.d.ts.map +1 -1
- package/dist/delegation-http/constants.js +2 -0
- package/dist/delegation-http/constants.js.map +1 -1
- package/dist/delegation-http/credential-consent.d.ts +3 -1
- package/dist/delegation-http/credential-consent.d.ts.map +1 -1
- package/dist/delegation-http/credential-consent.js +11 -1
- package/dist/delegation-http/credential-consent.js.map +1 -1
- package/dist/delegation-http/native-capabilities.d.ts +4 -0
- package/dist/delegation-http/native-capabilities.d.ts.map +1 -0
- package/dist/delegation-http/native-capabilities.js +53 -0
- package/dist/delegation-http/native-capabilities.js.map +1 -0
- package/dist/delegation-http/native-fetch.d.ts +3 -0
- package/dist/delegation-http/native-fetch.d.ts.map +1 -0
- package/dist/delegation-http/native-fetch.js +13 -0
- package/dist/delegation-http/native-fetch.js.map +1 -0
- package/dist/delegation-http/native-http.d.ts +102 -0
- package/dist/delegation-http/native-http.d.ts.map +1 -0
- package/dist/delegation-http/native-http.js +191 -0
- package/dist/delegation-http/native-http.js.map +1 -0
- package/dist/delegation-http/native-oauth.d.ts +26 -0
- package/dist/delegation-http/native-oauth.d.ts.map +1 -0
- package/dist/delegation-http/native-oauth.js +369 -0
- package/dist/delegation-http/native-oauth.js.map +1 -0
- package/dist/delegation-http/native-pickup.d.ts +20 -0
- package/dist/delegation-http/native-pickup.d.ts.map +1 -0
- package/dist/delegation-http/native-pickup.js +227 -0
- package/dist/delegation-http/native-pickup.js.map +1 -0
- package/dist/delegation-http/pickup-routes.d.ts +1 -0
- package/dist/delegation-http/pickup-routes.d.ts.map +1 -1
- package/dist/delegation-http/pickup-routes.js +55 -1
- package/dist/delegation-http/pickup-routes.js.map +1 -1
- package/dist/delegation-http/register.d.ts.map +1 -1
- package/dist/delegation-http/register.js +4 -7
- package/dist/delegation-http/register.js.map +1 -1
- package/dist/delegation-http/remote-issuer.d.ts +37 -0
- package/dist/delegation-http/remote-issuer.d.ts.map +1 -0
- package/dist/delegation-http/remote-issuer.js +289 -0
- package/dist/delegation-http/remote-issuer.js.map +1 -0
- package/dist/delegation-http/sid.d.ts +5 -2
- package/dist/delegation-http/sid.d.ts.map +1 -1
- package/dist/delegation-http/sid.js +8 -2
- package/dist/delegation-http/sid.js.map +1 -1
- package/dist/delegation-http/types.d.ts +18 -5
- package/dist/delegation-http/types.d.ts.map +1 -1
- package/dist/delegation-http/well-known-capability.d.ts.map +1 -1
- package/dist/delegation-http/well-known-capability.js +5 -0
- package/dist/delegation-http/well-known-capability.js.map +1 -1
- package/dist/helpers/env-mapper.d.ts.map +1 -1
- package/dist/helpers/env-mapper.js +4 -0
- package/dist/helpers/env-mapper.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/proof-generator.d.ts +2 -0
- package/dist/proof-generator.d.ts.map +1 -1
- package/dist/proof-generator.js +1 -0
- package/dist/proof-generator.js.map +1 -1
- package/dist/runtime/oauth-handler.d.ts.map +1 -1
- package/dist/runtime/oauth-handler.js +44 -1
- package/dist/runtime/oauth-handler.js.map +1 -1
- package/dist/security/mcp-admission.d.ts +43 -0
- package/dist/security/mcp-admission.d.ts.map +1 -0
- package/dist/security/mcp-admission.js +165 -0
- package/dist/security/mcp-admission.js.map +1 -0
- package/dist/security/mcp-holder-admission.d.ts +19 -0
- package/dist/security/mcp-holder-admission.d.ts.map +1 -0
- package/dist/security/mcp-holder-admission.js +52 -0
- package/dist/security/mcp-holder-admission.js.map +1 -0
- package/dist/security/presented-delegation.d.ts +13 -0
- package/dist/security/presented-delegation.d.ts.map +1 -0
- package/dist/security/presented-delegation.js +73 -0
- package/dist/security/presented-delegation.js.map +1 -0
- package/dist/services/consent.service.d.ts +10 -0
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +15 -3
- package/dist/services/consent.service.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { KYA_OS_CARD_PROOF_META_KEY, requireProof, } from "@kya-os/mcp/card";
|
|
2
|
+
import { hasMcpRequestProof } from "./presented-delegation";
|
|
3
|
+
function deny(code) {
|
|
4
|
+
return {
|
|
5
|
+
allowed: false,
|
|
6
|
+
result: {
|
|
7
|
+
isError: true,
|
|
8
|
+
content: [{ type: "text", text: JSON.stringify({ error: code }) }],
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Authenticate the live invoker before the existing consent/delegation gate.
|
|
14
|
+
* This grants no authority: the runtime must still verify the grant, account,
|
|
15
|
+
* provider and scopes. Invalid native proofs never fall back to an executor.
|
|
16
|
+
*/
|
|
17
|
+
export function createMcpHolderAdmission(options) {
|
|
18
|
+
return async (request, context) => {
|
|
19
|
+
try {
|
|
20
|
+
const { _meta, ...params } = request.params ?? {};
|
|
21
|
+
if (request.method !== "tools/call" || typeof params.name !== "string")
|
|
22
|
+
return deny("invalid_request");
|
|
23
|
+
const mode = await options.modeForTool(params.name);
|
|
24
|
+
if (!["native", "runtime-executor", "public"].includes(mode))
|
|
25
|
+
return deny("policy_unavailable");
|
|
26
|
+
if (mode === "native" || hasMcpRequestProof(_meta)) {
|
|
27
|
+
// The canonical carrier wins even when null/malformed. Published core
|
|
28
|
+
// 1.15 uses nullish fallback; do not let a legacy proof replace an
|
|
29
|
+
// explicitly empty canonical proof on this required admission path.
|
|
30
|
+
if (_meta &&
|
|
31
|
+
Object.prototype.hasOwnProperty.call(_meta, KYA_OS_CARD_PROOF_META_KEY) &&
|
|
32
|
+
_meta[KYA_OS_CARD_PROOF_META_KEY] == null)
|
|
33
|
+
return deny("proof_missing");
|
|
34
|
+
const guard = requireProof(await options.proof(context));
|
|
35
|
+
const proof = await guard({ method: request.method, params }, _meta);
|
|
36
|
+
return proof.ok
|
|
37
|
+
? { allowed: true, holder: { did: proof.did, level: proof.level } }
|
|
38
|
+
: deny(proof.error.code);
|
|
39
|
+
}
|
|
40
|
+
if (mode === "runtime-executor") {
|
|
41
|
+
return (await options.authorizeExecutor?.(request, context)) === true
|
|
42
|
+
? { allowed: true }
|
|
43
|
+
: deny("executor_not_authorized");
|
|
44
|
+
}
|
|
45
|
+
return { allowed: true };
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return deny("authorization_unavailable");
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=mcp-holder-admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-holder-admission.js","sourceRoot":"","sources":["../../src/security/mcp-holder-admission.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,YAAY,GAEb,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAuB5D,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACnE;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAkC;IAElC,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACpE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC1D,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,sEAAsE;gBACtE,mEAAmE;gBACnE,oEAAoE;gBACpE,IACE,KAAK;oBACL,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAClC,KAAK,EACL,0BAA0B,CAC3B;oBACD,KAAK,CAAC,0BAA0B,CAAC,IAAI,IAAI;oBAEzC,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC,EAAE;oBACb,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE;oBACnE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI;oBACnE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;oBACnB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JSONRPCRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
/** Parsing identifies a credential carrier only. It establishes no authority. */
|
|
3
|
+
export declare function decodeJwtPayload(jwt: string): Record<string, unknown> | null;
|
|
4
|
+
export declare class InvalidDelegationPresentation extends Error {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
export declare function readHeaderDelegation(getHeader: (name: string) => string | null): string | undefined;
|
|
8
|
+
/** Presence, including malformed values, must never select an unsigned lane. */
|
|
9
|
+
export declare function hasMcpRequestProof(meta: unknown): boolean;
|
|
10
|
+
/** Keep the original request intact; handlers consume this unverified token
|
|
11
|
+
* out of band and still require the existing delegation verifier to accept it. */
|
|
12
|
+
export declare function readPresentedMcpDelegation(request: JSONRPCRequest, headers?: Record<string, string | string[] | undefined>): string | undefined;
|
|
13
|
+
//# sourceMappingURL=presented-delegation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presented-delegation.d.ts","sourceRoot":"","sources":["../../src/security/presented-delegation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAc5E;AAED,qBAAa,6BAA8B,SAAQ,KAAK;;CAIvD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACzC,MAAM,GAAG,SAAS,CAiBpB;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQzD;AAED;kFACkF;AAClF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAM,GAC1D,MAAM,GAAG,SAAS,CA4BpB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { KYA_OS_CARD_PROOF_META_KEY, LEGACY_CARD_PROOF_META_KEY, } from "@kya-os/mcp/card";
|
|
2
|
+
import { FALLBACK_DELEGATION_HEADER } from "../delegation-http/constants";
|
|
3
|
+
/** Parsing identifies a credential carrier only. It establishes no authority. */
|
|
4
|
+
export function decodeJwtPayload(jwt) {
|
|
5
|
+
const parts = jwt.split(".");
|
|
6
|
+
if (parts.length !== 3)
|
|
7
|
+
return null;
|
|
8
|
+
try {
|
|
9
|
+
const b64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
|
|
10
|
+
const payload = JSON.parse(atob(b64 + "=".repeat((4 - (b64.length % 4)) % 4)));
|
|
11
|
+
return payload && typeof payload === "object" && !Array.isArray(payload)
|
|
12
|
+
? payload
|
|
13
|
+
: null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class InvalidDelegationPresentation extends Error {
|
|
20
|
+
constructor() {
|
|
21
|
+
super("Invalid or conflicting delegation carriers");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function readHeaderDelegation(getHeader) {
|
|
25
|
+
const auth = getHeader("Authorization");
|
|
26
|
+
const bearer = auth
|
|
27
|
+
? /^Bearer\s+(.+)$/i.exec(auth.trim())?.[1].trim()
|
|
28
|
+
: undefined;
|
|
29
|
+
const bearerPayload = bearer ? decodeJwtPayload(bearer) : null;
|
|
30
|
+
const credential = bearerPayload && "vc" in bearerPayload ? bearer : undefined;
|
|
31
|
+
const fallback = getHeader(FALLBACK_DELEGATION_HEADER);
|
|
32
|
+
if (fallback !== null) {
|
|
33
|
+
const token = fallback.trim();
|
|
34
|
+
const payload = decodeJwtPayload(token);
|
|
35
|
+
if (!payload || !("vc" in payload) || (credential && credential !== token))
|
|
36
|
+
throw new InvalidDelegationPresentation();
|
|
37
|
+
return token;
|
|
38
|
+
}
|
|
39
|
+
return credential;
|
|
40
|
+
}
|
|
41
|
+
/** Presence, including malformed values, must never select an unsigned lane. */
|
|
42
|
+
export function hasMcpRequestProof(meta) {
|
|
43
|
+
return (meta !== null &&
|
|
44
|
+
typeof meta === "object" &&
|
|
45
|
+
[KYA_OS_CARD_PROOF_META_KEY, LEGACY_CARD_PROOF_META_KEY].some((key) => Object.prototype.hasOwnProperty.call(meta, key)));
|
|
46
|
+
}
|
|
47
|
+
/** Keep the original request intact; handlers consume this unverified token
|
|
48
|
+
* out of band and still require the existing delegation verifier to accept it. */
|
|
49
|
+
export function readPresentedMcpDelegation(request, headers = {}) {
|
|
50
|
+
const headerToken = readHeaderDelegation((name) => {
|
|
51
|
+
const matches = Object.entries(headers).filter(([key, value]) => key.toLowerCase() === name.toLowerCase() && value !== undefined);
|
|
52
|
+
if (matches.length > 1)
|
|
53
|
+
throw new InvalidDelegationPresentation();
|
|
54
|
+
const value = matches[0]?.[1];
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
if (value.length !== 1)
|
|
57
|
+
throw new InvalidDelegationPresentation();
|
|
58
|
+
return value[0];
|
|
59
|
+
}
|
|
60
|
+
return value ?? null;
|
|
61
|
+
});
|
|
62
|
+
const params = request.params;
|
|
63
|
+
if (!params ||
|
|
64
|
+
!Object.prototype.hasOwnProperty.call(params, "delegationToken"))
|
|
65
|
+
return headerToken;
|
|
66
|
+
const bodyToken = params.delegationToken;
|
|
67
|
+
if (typeof bodyToken !== "string" ||
|
|
68
|
+
!bodyToken.trim() ||
|
|
69
|
+
(headerToken !== undefined && bodyToken !== headerToken))
|
|
70
|
+
throw new InvalidDelegationPresentation();
|
|
71
|
+
return bodyToken;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=presented-delegation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presented-delegation.js","sourceRoot":"","sources":["../../src/security/presented-delegation.ts"],"names":[],"mappings":"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"}
|
|
@@ -650,6 +650,7 @@ export declare class ConsentService {
|
|
|
650
650
|
tool: string;
|
|
651
651
|
scopes: string[];
|
|
652
652
|
projectId: string;
|
|
653
|
+
binding?: string;
|
|
653
654
|
}): Promise<string>;
|
|
654
655
|
/**
|
|
655
656
|
* Verify a grant-bound identity assertion minted by `mintIdentityAssertion`.
|
|
@@ -669,6 +670,15 @@ export declare class ConsentService {
|
|
|
669
670
|
* bypass belongs at the call site (see `isDevConsentTestMode`'s
|
|
670
671
|
* docstring), never as a predictable/empty signing key inside this helper.
|
|
671
672
|
*/
|
|
673
|
+
verifyNativeIdentityAssertion(token: string, expected: {
|
|
674
|
+
sid: string;
|
|
675
|
+
agentDid: string;
|
|
676
|
+
tool: string;
|
|
677
|
+
scopes: string[];
|
|
678
|
+
projectId: string;
|
|
679
|
+
provider: string;
|
|
680
|
+
binding: string;
|
|
681
|
+
}): Promise<string | null>;
|
|
672
682
|
private verifyIdentityAssertion;
|
|
673
683
|
/**
|
|
674
684
|
* Build full DelegationRecord format request (future format)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.service.d.ts","sourceRoot":"","sources":["../../src/services/consent.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"consent.service.d.ts","sourceRoot":"","sources":["../../src/services/consent.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { ConsentConfigService } from "./consent-config.service";
|
|
10
10
|
import { TemplateRenderer } from "./consent-templates/template-renderer";
|
|
11
11
|
import { DEFAULT_AGENTSHIELD_URL, DEFAULT_SESSION_CACHE_TTL, KEY_PAIR_TTL_SECONDS, CONSENT_PROVIDER_TYPES, } from "../constants";
|
|
12
|
-
import { STORAGE_KEYS, isPendingDelegationId
|
|
12
|
+
import { STORAGE_KEYS, isPendingDelegationId } from "../constants/storage-keys";
|
|
13
13
|
import { loadDay0Config, getDelegationFieldName } from "../utils/day0-config";
|
|
14
14
|
import { buildProviderAuthorizeUrl } from "../runtime/oidc/authorize-url.js";
|
|
15
15
|
import { resolveIdpScopes } from "../runtime/oidc/idp-scopes.js";
|
|
@@ -5162,6 +5162,7 @@ export class ConsentService {
|
|
|
5162
5162
|
tool: params.tool,
|
|
5163
5163
|
scopesHash,
|
|
5164
5164
|
projectId: params.projectId,
|
|
5165
|
+
...(params.binding ? { binding: params.binding } : {}),
|
|
5165
5166
|
exp,
|
|
5166
5167
|
});
|
|
5167
5168
|
const payloadB64 = this.base64UrlEncodeString(payload);
|
|
@@ -5187,6 +5188,11 @@ export class ConsentService {
|
|
|
5187
5188
|
* bypass belongs at the call site (see `isDevConsentTestMode`'s
|
|
5188
5189
|
* docstring), never as a predictable/empty signing key inside this helper.
|
|
5189
5190
|
*/
|
|
5191
|
+
async verifyNativeIdentityAssertion(token, expected) {
|
|
5192
|
+
if (!expected.provider || !expected.binding || token.length > 16384)
|
|
5193
|
+
return null;
|
|
5194
|
+
return this.verifyIdentityAssertion(token, expected);
|
|
5195
|
+
}
|
|
5190
5196
|
async verifyIdentityAssertion(token, expected) {
|
|
5191
5197
|
const secret = this.env.OAUTH_ENCRYPTION_SECRET;
|
|
5192
5198
|
if (!secret) {
|
|
@@ -5203,6 +5209,10 @@ export class ConsentService {
|
|
|
5203
5209
|
const payloadB64 = token.substring(dotIndex + 1);
|
|
5204
5210
|
const payloadJson = this.base64UrlDecodeString(payloadB64);
|
|
5205
5211
|
const payload = JSON.parse(payloadJson);
|
|
5212
|
+
if ((expected.provider !== undefined &&
|
|
5213
|
+
payload.provider !== expected.provider) ||
|
|
5214
|
+
(expected.binding !== undefined && payload.binding !== expected.binding))
|
|
5215
|
+
return null;
|
|
5206
5216
|
if (payload.sid !== expected.sid) {
|
|
5207
5217
|
logger.warn("[ConsentService] Identity assertion sid mismatch");
|
|
5208
5218
|
return null;
|
|
@@ -5225,7 +5235,7 @@ export class ConsentService {
|
|
|
5225
5235
|
return null;
|
|
5226
5236
|
}
|
|
5227
5237
|
if (typeof payload.exp !== "number" ||
|
|
5228
|
-
payload.exp
|
|
5238
|
+
payload.exp <= Math.floor(Date.now() / 1000)) {
|
|
5229
5239
|
logger.warn("[ConsentService] Identity assertion expired");
|
|
5230
5240
|
return null;
|
|
5231
5241
|
}
|
|
@@ -5244,7 +5254,9 @@ export class ConsentService {
|
|
|
5244
5254
|
return payload.userDid;
|
|
5245
5255
|
}
|
|
5246
5256
|
catch (error) {
|
|
5247
|
-
|
|
5257
|
+
if (expected.binding === undefined) {
|
|
5258
|
+
logger.error("[ConsentService] Identity assertion verification error:", error);
|
|
5259
|
+
}
|
|
5248
5260
|
return null;
|
|
5249
5261
|
}
|
|
5250
5262
|
}
|