@caracalai/identity 0.1.2 → 0.1.4-rc.1
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 +7 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jwks.d.ts +13 -0
- package/dist/jwks.d.ts.map +1 -1
- package/dist/jwks.js +86 -28
- package/dist/jwks.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/verify.d.ts +4 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +98 -29
- package/dist/verify.js.map +1 -1
- package/package.json +4 -4
package/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Caracal Identity for TypeScript
|
|
2
|
+
|
|
3
|
+
TypeScript JWT verification, JWKS cache, scope checks, and claim contracts for Caracal resource servers.
|
|
4
|
+
|
|
5
|
+
This package requires authoritative token claims including `exp`, `iat`, `jti`, `sub`, `sid`, `client_id`, `zone_id`, and `use`. Verification failures are authentication failures; callers should not fall back to anonymous or partially trusted identity state.
|
|
6
|
+
|
|
7
|
+
Docs: https://caracal.run/sdks/identity/
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
2
|
// Caracal, a product of Garudex Labs
|
|
3
3
|
//
|
|
4
|
-
// @caracalai/identity
|
|
4
|
+
// @caracalai/identity: JWT verify, JWKS cache, scope evaluation, and claim types.
|
|
5
5
|
export * from './jwks.js';
|
|
6
6
|
export * from './scope.js';
|
|
7
7
|
export * from './types.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,kFAAkF;AAElF,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
package/dist/jwks.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import { type JWTVerifyGetKey } from 'jose';
|
|
2
|
+
export interface JwksCacheOptions {
|
|
3
|
+
ttlMs?: number;
|
|
4
|
+
fetchTimeoutMs?: number;
|
|
5
|
+
fetchImpl?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export interface JwksCache {
|
|
8
|
+
getKeySet: (issuer: string) => Promise<JWTVerifyGetKey>;
|
|
9
|
+
warm: (issuer: string) => Promise<void>;
|
|
10
|
+
clear: (issuer?: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function createJwksCache(opts?: JwksCacheOptions): JwksCache;
|
|
2
13
|
export declare function getKeySet(issuer: string): Promise<JWTVerifyGetKey>;
|
|
14
|
+
export declare function warmJwks(issuer: string): Promise<void>;
|
|
15
|
+
export declare function clearJwksCache(issuer?: string): void;
|
|
3
16
|
//# sourceMappingURL=jwks.d.ts.map
|
package/dist/jwks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwks.d.ts","sourceRoot":"","sources":["../src/jwks.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"jwks.d.ts","sourceRoot":"","sources":["../src/jwks.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,MAAM,CAAA;AAQ9D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAyBD,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAuDtE;AAID,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAExE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpD"}
|
package/dist/jwks.js
CHANGED
|
@@ -1,38 +1,96 @@
|
|
|
1
1
|
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
2
|
// Caracal, a product of Garudex Labs
|
|
3
3
|
//
|
|
4
|
-
// JWKS cache
|
|
4
|
+
// JWKS cache for mandate signature verification.
|
|
5
5
|
import { createLocalJWKSet } from 'jose';
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
7
|
+
const DEFAULT_FETCH_TIMEOUT_MS = 5_000;
|
|
8
|
+
function assertSecureIssuer(issuer) {
|
|
9
|
+
const parsed = new URL(issuer);
|
|
10
|
+
if (parsed.protocol === 'https:')
|
|
11
|
+
return;
|
|
12
|
+
if (parsed.protocol === 'http:') {
|
|
13
|
+
const insecureAllowed = isLoopbackHost(parsed.hostname) ||
|
|
14
|
+
(process.env.NODE_ENV ?? 'development') === 'development' ||
|
|
15
|
+
process.env.CARACAL_ALLOW_INSECURE_CONFIG_URLS === 'true';
|
|
16
|
+
if (insecureAllowed)
|
|
17
|
+
return;
|
|
18
|
+
throw new Error('insecure issuer scheme: http requires a loopback host or development mode');
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`unsupported issuer scheme: ${parsed.protocol}`);
|
|
21
|
+
}
|
|
22
|
+
function isLoopbackHost(host) {
|
|
23
|
+
if (host === 'localhost')
|
|
24
|
+
return true;
|
|
25
|
+
if (host === '::1' || host === '[::1]')
|
|
26
|
+
return true;
|
|
27
|
+
return /^127(?:\.\d{1,3}){3}$/.test(host);
|
|
28
|
+
}
|
|
29
|
+
export function createJwksCache(opts = {}) {
|
|
30
|
+
const ttlMs = opts.ttlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
31
|
+
const fetchTimeoutMs = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;
|
|
32
|
+
const fetchImpl = opts.fetchImpl;
|
|
33
|
+
const cache = new Map();
|
|
34
|
+
async function getKeySet(issuer) {
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const entry = cache.get(issuer);
|
|
37
|
+
if (entry) {
|
|
38
|
+
const age = now - entry.fetchedAt;
|
|
39
|
+
if (age < ttlMs)
|
|
40
|
+
return entry.keySet;
|
|
41
|
+
if (!entry.revalidating) {
|
|
42
|
+
entry.revalidating = fetchAndStore(issuer)
|
|
43
|
+
.catch(() => entry.keySet)
|
|
44
|
+
.finally(() => {
|
|
45
|
+
const current = cache.get(issuer);
|
|
46
|
+
if (current)
|
|
47
|
+
current.revalidating = undefined;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
14
50
|
return entry.keySet;
|
|
15
|
-
if (!entry.revalidating) {
|
|
16
|
-
entry.revalidating = true;
|
|
17
|
-
fetchAndStore(issuer).catch((err) => {
|
|
18
|
-
console.error('JWKS refresh failed:', err);
|
|
19
|
-
const e = cache.get(issuer);
|
|
20
|
-
if (e)
|
|
21
|
-
e.revalidating = false;
|
|
22
|
-
});
|
|
23
51
|
}
|
|
24
|
-
return
|
|
52
|
+
return fetchAndStore(issuer);
|
|
53
|
+
}
|
|
54
|
+
async function fetchAndStore(issuer) {
|
|
55
|
+
assertSecureIssuer(issuer);
|
|
56
|
+
const url = `${issuer.replace(/\/$/, '')}/.well-known/jwks.json`;
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
const timeout = setTimeout(() => controller.abort(), fetchTimeoutMs);
|
|
59
|
+
try {
|
|
60
|
+
const res = await (fetchImpl ?? fetch)(url, { signal: controller.signal });
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
throw new Error(`JWKS fetch failed: ${res.status}`);
|
|
63
|
+
const body = (await res.json());
|
|
64
|
+
const keySet = createLocalJWKSet({ keys: body.keys });
|
|
65
|
+
cache.set(issuer, { keySet, fetchedAt: Date.now() });
|
|
66
|
+
return keySet;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timeout);
|
|
70
|
+
}
|
|
25
71
|
}
|
|
26
|
-
return
|
|
72
|
+
return {
|
|
73
|
+
getKeySet,
|
|
74
|
+
async warm(issuer) {
|
|
75
|
+
await getKeySet(issuer);
|
|
76
|
+
},
|
|
77
|
+
clear(issuer) {
|
|
78
|
+
if (issuer) {
|
|
79
|
+
cache.delete(issuer);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
cache.clear();
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const defaultCache = createJwksCache();
|
|
87
|
+
export async function getKeySet(issuer) {
|
|
88
|
+
return defaultCache.getKeySet(issuer);
|
|
89
|
+
}
|
|
90
|
+
export async function warmJwks(issuer) {
|
|
91
|
+
await defaultCache.warm(issuer);
|
|
27
92
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const res = await fetch(url);
|
|
31
|
-
if (!res.ok)
|
|
32
|
-
throw new Error(`JWKS fetch failed: ${res.status}`);
|
|
33
|
-
const body = (await res.json());
|
|
34
|
-
const keySet = createLocalJWKSet({ keys: body.keys });
|
|
35
|
-
cache.set(issuer, { keySet, fetchedAt: Date.now(), revalidating: false });
|
|
36
|
-
return keySet;
|
|
93
|
+
export function clearJwksCache(issuer) {
|
|
94
|
+
defaultCache.clear(issuer);
|
|
37
95
|
}
|
|
38
96
|
//# sourceMappingURL=jwks.js.map
|
package/dist/jwks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwks.js","sourceRoot":"","sources":["../src/jwks.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"jwks.js","sourceRoot":"","sources":["../src/jwks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
export declare const DEFAULT_MAX_HOP_COUNT = 10;
|
|
2
|
+
export declare const MANDATE_USE_SESSION = "session";
|
|
3
|
+
export declare const MANDATE_USE_RESOURCE = "resource";
|
|
4
|
+
export declare const SUBJECT_TYPE_USER = "user";
|
|
5
|
+
export declare const SUBJECT_TYPE_APPLICATION = "application";
|
|
2
6
|
export interface JwtConfig {
|
|
3
7
|
issuer: string;
|
|
4
8
|
audience: string;
|
|
5
9
|
zoneId?: string;
|
|
6
10
|
requiredScopes?: string[];
|
|
11
|
+
requiredTargets?: string[];
|
|
12
|
+
requiredUse?: string;
|
|
7
13
|
requireAgent?: boolean;
|
|
8
14
|
requireDelegation?: boolean;
|
|
9
15
|
requireChainContains?: string[];
|
|
@@ -19,7 +25,14 @@ export interface Claims {
|
|
|
19
25
|
zoneId: string;
|
|
20
26
|
clientId: string;
|
|
21
27
|
sid: string;
|
|
28
|
+
rootSid: string;
|
|
29
|
+
use: string;
|
|
30
|
+
subType: string;
|
|
31
|
+
jti: string;
|
|
32
|
+
issuedAt: number;
|
|
33
|
+
expiresAt: number;
|
|
22
34
|
scope: string;
|
|
35
|
+
targetResources?: string[];
|
|
23
36
|
agentSessionId?: string;
|
|
24
37
|
delegationEdgeId?: string;
|
|
25
38
|
sourceSessionId?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,mBAAmB,YAAY,CAAA;AAC5C,eAAO,MAAM,oBAAoB,aAAa,CAAA;AAC9C,eAAO,MAAM,iBAAiB,SAAS,CAAA;AACvC,eAAO,MAAM,wBAAwB,gBAAgB,CAAA;AAErD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
|
package/dist/types.js
CHANGED
|
@@ -7,4 +7,8 @@
|
|
|
7
7
|
// that would have been blocked at spawn time cannot pass a permissive resource
|
|
8
8
|
// server.
|
|
9
9
|
export const DEFAULT_MAX_HOP_COUNT = 10;
|
|
10
|
+
export const MANDATE_USE_SESSION = 'session';
|
|
11
|
+
export const MANDATE_USE_RESOURCE = 'resource';
|
|
12
|
+
export const SUBJECT_TYPE_USER = 'user';
|
|
13
|
+
export const SUBJECT_TYPE_APPLICATION = 'application';
|
|
10
14
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,iEAAiE;AAEjE,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,UAAU;AACV,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,iEAAiE;AAEjE,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,UAAU;AACV,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAA;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAA;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAA"}
|
package/dist/verify.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CaracalError } from '@caracalai/core';
|
|
2
|
+
import { type JwksCache } from './jwks.js';
|
|
2
3
|
import { type Claims, type JwtConfig } from './types.js';
|
|
3
4
|
export declare class TokenInvalidError extends CaracalError {
|
|
4
5
|
constructor(message?: string, cause?: unknown);
|
|
@@ -23,6 +24,8 @@ export declare class ChainMismatchError extends CaracalError {
|
|
|
23
24
|
export declare class HopCountExceededError extends CaracalError {
|
|
24
25
|
constructor(message?: string);
|
|
25
26
|
}
|
|
26
|
-
export declare function verify(token: string, config: JwtConfig
|
|
27
|
+
export declare function verify(token: string, config: JwtConfig & {
|
|
28
|
+
jwksCache?: JwksCache;
|
|
29
|
+
}): Promise<Claims>;
|
|
27
30
|
export declare function verifyChainContains(claims: Claims, applicationId: string): boolean;
|
|
28
31
|
//# sourceMappingURL=verify.d.ts.map
|
package/dist/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAmF,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAIzI,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAA4B,EAAE,KAAK,CAAC,EAAE,OAAO;CAIjE;AAED,qBAAa,gBAAiB,SAAQ,YAAY;gBACpC,OAAO,SAAiC;CAIrD;AAED,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;gBACjB,YAAY,EAAE,MAAM;CAKjC;AAED,qBAAa,0BAA2B,SAAQ,YAAY;gBAC9C,OAAO,SAA4B;CAIhD;AAED,qBAAa,uBAAwB,SAAQ,YAAY;gBAC3C,OAAO,SAAwB;CAI5C;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;gBACzB,oBAAoB,EAAE,MAAM;CAOzC;AAED,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,OAAO,SAAuB;CAI3C;AA4DD,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6F1G;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAIlF"}
|
package/dist/verify.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { jwtVerify } from 'jose';
|
|
6
6
|
import { CaracalError, hasScope } from '@caracalai/core';
|
|
7
7
|
import { getKeySet } from './jwks.js';
|
|
8
|
-
import { DEFAULT_MAX_HOP_COUNT } from './types.js';
|
|
8
|
+
import { DEFAULT_MAX_HOP_COUNT, MANDATE_USE_RESOURCE, MANDATE_USE_SESSION } from './types.js';
|
|
9
|
+
const REQUIRED_CLAIMS = ['exp', 'iat', 'jti', 'sub', 'client_id', 'sid', 'root_sid', 'use', 'sub_type'];
|
|
9
10
|
export class TokenInvalidError extends CaracalError {
|
|
10
11
|
constructor(message = 'Token validation failed', cause) {
|
|
11
12
|
super('invalid_token', message, cause !== undefined ? { cause } : {});
|
|
@@ -54,62 +55,123 @@ export class HopCountExceededError extends CaracalError {
|
|
|
54
55
|
this.name = 'HopCountExceededError';
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
|
-
function
|
|
58
|
+
function requiredString(payload, name) {
|
|
59
|
+
const value = payload[name];
|
|
60
|
+
if (typeof value !== 'string' || value === '') {
|
|
61
|
+
throw new TokenInvalidError(`Token claim ${name} is required`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
function optionalString(payload, name) {
|
|
66
|
+
const value = payload[name];
|
|
67
|
+
if (value === undefined || value === null || value === '')
|
|
68
|
+
return undefined;
|
|
69
|
+
if (typeof value !== 'string')
|
|
70
|
+
throw new TokenInvalidError(`Token claim ${name} must be a string`);
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
function optionalInteger(payload, name) {
|
|
74
|
+
const value = payload[name];
|
|
75
|
+
if (value === undefined || value === null)
|
|
76
|
+
return undefined;
|
|
77
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
|
|
78
|
+
throw new TokenInvalidError(`Token claim ${name} must be a non-negative integer`);
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
function requiredInteger(payload, name) {
|
|
83
|
+
const value = optionalInteger(payload, name);
|
|
84
|
+
if (value === undefined)
|
|
85
|
+
throw new TokenInvalidError(`Token claim ${name} is required`);
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
function readStringList(raw, name) {
|
|
89
|
+
if (raw === undefined || raw === null)
|
|
90
|
+
return undefined;
|
|
58
91
|
if (!Array.isArray(raw))
|
|
92
|
+
throw new TokenInvalidError(`Token claim ${name} must be a string array`);
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const value of raw) {
|
|
95
|
+
if (typeof value !== 'string' || value === '')
|
|
96
|
+
throw new TokenInvalidError(`Token claim ${name} must be a string array`);
|
|
97
|
+
out.push(value);
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
function readChain(raw) {
|
|
102
|
+
if (raw === undefined || raw === null)
|
|
59
103
|
return undefined;
|
|
104
|
+
if (!Array.isArray(raw))
|
|
105
|
+
throw new TokenInvalidError('Token claim delegation_chain must be an array');
|
|
60
106
|
const out = [];
|
|
61
107
|
for (const item of raw) {
|
|
62
|
-
if (item
|
|
63
|
-
|
|
64
|
-
const applicationId = typeof r['app'] === 'string' ? r['app'] : '';
|
|
65
|
-
if (!applicationId)
|
|
66
|
-
continue;
|
|
67
|
-
out.push({
|
|
68
|
-
applicationId,
|
|
69
|
-
agentSessionId: typeof r['session'] === 'string' ? r['session'] : undefined,
|
|
70
|
-
delegationEdgeId: typeof r['edge'] === 'string' ? r['edge'] : undefined,
|
|
71
|
-
});
|
|
108
|
+
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
109
|
+
throw new TokenInvalidError('Token claim delegation_chain must contain objects');
|
|
72
110
|
}
|
|
111
|
+
const r = item;
|
|
112
|
+
const applicationId = requiredString(r, 'application_id');
|
|
113
|
+
const agentSessionId = optionalString(r, 'agent_session_id');
|
|
114
|
+
const delegationEdgeId = optionalString(r, 'delegation_edge_id');
|
|
115
|
+
out.push({ applicationId, agentSessionId, delegationEdgeId });
|
|
73
116
|
}
|
|
74
117
|
return out.length === 0 ? undefined : out;
|
|
75
118
|
}
|
|
76
119
|
export async function verify(token, config) {
|
|
77
120
|
let payload;
|
|
78
121
|
try {
|
|
79
|
-
const keySet = await getKeySet(config.issuer);
|
|
122
|
+
const keySet = config.jwksCache ? await config.jwksCache.getKeySet(config.issuer) : await getKeySet(config.issuer);
|
|
80
123
|
({ payload } = await jwtVerify(token, keySet, {
|
|
81
124
|
issuer: config.issuer,
|
|
82
125
|
audience: config.audience,
|
|
83
126
|
algorithms: ['ES256'],
|
|
127
|
+
requiredClaims: REQUIRED_CLAIMS,
|
|
84
128
|
}));
|
|
85
129
|
}
|
|
86
130
|
catch (err) {
|
|
87
131
|
throw new TokenInvalidError('Token validation failed', err);
|
|
88
132
|
}
|
|
133
|
+
const jti = requiredString(payload, 'jti');
|
|
134
|
+
const sub = requiredString(payload, 'sub');
|
|
135
|
+
const clientId = requiredString(payload, 'client_id');
|
|
136
|
+
const sid = requiredString(payload, 'sid');
|
|
137
|
+
const rootSid = requiredString(payload, 'root_sid');
|
|
138
|
+
const use = requiredString(payload, 'use');
|
|
139
|
+
if (use !== MANDATE_USE_SESSION && use !== MANDATE_USE_RESOURCE)
|
|
140
|
+
throw new TokenInvalidError('Token use validation failed');
|
|
141
|
+
const subType = requiredString(payload, 'sub_type');
|
|
142
|
+
if (subType !== 'user' && subType !== 'application')
|
|
143
|
+
throw new TokenInvalidError('Token subject type validation failed');
|
|
144
|
+
const issuedAt = requiredInteger(payload, 'iat');
|
|
145
|
+
const expiresAt = requiredInteger(payload, 'exp');
|
|
89
146
|
const scope = payload['scope'] ?? '';
|
|
90
|
-
|
|
91
|
-
|
|
147
|
+
if (typeof scope !== 'string')
|
|
148
|
+
throw new TokenInvalidError('Token claim scope must be a string');
|
|
149
|
+
const targetResources = readStringList(payload['target'], 'target');
|
|
150
|
+
const rawZoneId = payload['zone_id'];
|
|
151
|
+
if (typeof rawZoneId !== 'string' || rawZoneId === '' || (config.zoneId && rawZoneId !== config.zoneId)) {
|
|
92
152
|
throw new ZoneInvalidError();
|
|
93
153
|
}
|
|
154
|
+
const zoneId = rawZoneId;
|
|
155
|
+
if (config.requiredUse && use !== config.requiredUse)
|
|
156
|
+
throw new TokenInvalidError('Token use validation failed');
|
|
94
157
|
for (const required of config.requiredScopes ?? []) {
|
|
95
158
|
if (!hasScope(scope, required)) {
|
|
96
159
|
throw new ScopeInsufficientError(required);
|
|
97
160
|
}
|
|
98
161
|
}
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
162
|
+
for (const target of config.requiredTargets ?? []) {
|
|
163
|
+
if (!targetResources?.includes(target)) {
|
|
164
|
+
throw new TokenInvalidError('Token target resource validation failed');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const agentSessionId = optionalString(payload, 'agent_session_id');
|
|
168
|
+
const delegationEdgeId = optionalString(payload, 'delegation_edge_id');
|
|
169
|
+
const sourceSessionId = optionalString(payload, 'source_session_id');
|
|
170
|
+
const targetSessionId = optionalString(payload, 'target_session_id');
|
|
171
|
+
const delegationPath = readStringList(payload['delegation_path'], 'delegation_path');
|
|
108
172
|
const delegationChain = readChain(payload['delegation_chain']);
|
|
109
|
-
const graphEpoch =
|
|
110
|
-
|
|
111
|
-
: undefined;
|
|
112
|
-
const hopCount = typeof payload['hop_count'] === 'number' ? payload['hop_count'] : undefined;
|
|
173
|
+
const graphEpoch = optionalInteger(payload, 'delegation_graph_epoch');
|
|
174
|
+
const hopCount = optionalInteger(payload, 'hop_count');
|
|
113
175
|
if (config.requireAgent && !agentSessionId) {
|
|
114
176
|
throw new AgentIdentityRequiredError();
|
|
115
177
|
}
|
|
@@ -128,11 +190,18 @@ export async function verify(token, config) {
|
|
|
128
190
|
throw new ChainMismatchError(expected);
|
|
129
191
|
}
|
|
130
192
|
return {
|
|
131
|
-
sub
|
|
193
|
+
sub,
|
|
132
194
|
zoneId,
|
|
133
195
|
clientId,
|
|
134
196
|
sid,
|
|
197
|
+
rootSid,
|
|
198
|
+
use,
|
|
199
|
+
subType,
|
|
200
|
+
jti,
|
|
201
|
+
issuedAt,
|
|
202
|
+
expiresAt,
|
|
135
203
|
scope,
|
|
204
|
+
targetResources,
|
|
136
205
|
agentSessionId,
|
|
137
206
|
delegationEdgeId,
|
|
138
207
|
sourceSessionId,
|
package/dist/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,oFAAoF;AAEpF,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caracalai/identity",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4-rc.1",
|
|
4
4
|
"description": "Caracal identity primitives: JWT verification, JWKS, scope, claims.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/Garudex-Labs/caracal",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
28
|
"dist",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"README.md"
|
|
31
31
|
],
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"prepublishOnly": "tsc"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@caracalai/core": "0.1.
|
|
43
|
+
"@caracalai/core": "0.1.4-rc.1",
|
|
44
44
|
"jose": "^6.2.3"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|