@schemavaults/jwt 0.8.4 → 0.11.3
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/jwt/custom-jwt-payload-to-user-data.d.ts +7 -0
- package/dist/jwt/custom-jwt-payload-to-user-data.js +17 -0
- package/dist/jwt/custom-jwt-payload-to-user-data.js.map +1 -1
- package/dist/jwt/generate.d.ts +5 -0
- package/dist/jwt/generate.js +3 -0
- package/dist/jwt/generate.js.map +1 -1
- package/dist/jwt/generate_id_token.d.ts +43 -0
- package/dist/jwt/generate_id_token.js +63 -0
- package/dist/jwt/generate_id_token.js.map +1 -0
- package/dist/jwt/index.d.ts +4 -2
- package/dist/jwt/index.js +3 -2
- package/dist/jwt/index.js.map +1 -1
- package/dist/jwt/jwt-factory.d.ts +6 -2
- package/dist/jwt/jwt-factory.js +6 -5
- package/dist/jwt/jwt-factory.js.map +1 -1
- package/dist/jwt/jwt_keys/index.d.ts +1 -0
- package/dist/jwt/jwt_keys/index.js +1 -0
- package/dist/jwt/jwt_keys/index.js.map +1 -1
- package/dist/jwt/jwt_keys/to_public_verification_jwks.d.ts +17 -0
- package/dist/jwt/jwt_keys/to_public_verification_jwks.js +53 -0
- package/dist/jwt/jwt_keys/to_public_verification_jwks.js.map +1 -0
- package/dist/jwt/payload_data.d.ts +14 -7
- package/dist/jwt/payload_data.js +6 -0
- package/dist/jwt/payload_data.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import type { UserData } from "@schemavaults/auth-common";
|
|
2
2
|
import type { CustomJWTPayload } from "./payload_data";
|
|
3
3
|
export declare function customJwtPayloadToUserData(payload: CustomJWTPayload): UserData;
|
|
4
|
+
/**
|
|
5
|
+
* Extracts the granted scope claim from a decoded custom-JWT payload, to be
|
|
6
|
+
* carried alongside the UserData. Returns null when the token has no scope
|
|
7
|
+
* claim (issued before scopes became first-class), which route guards treat
|
|
8
|
+
* as "no scopes granted".
|
|
9
|
+
*/
|
|
10
|
+
export declare function getScopeFromCustomJwtPayload(payload: CustomJWTPayload): string | null;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// Maps a decoded custom-JWT payload to the canonical UserData. The token's
|
|
2
|
+
// granted `scope` is deliberately NOT folded in here — it is threaded
|
|
3
|
+
// ALONGSIDE the user data (see `getScopeFromCustomJwtPayload` and the
|
|
4
|
+
// `{ user, scope }` record in @schemavaults/auth-server-sdk's
|
|
5
|
+
// decodeJWTsWithKeyManager) so route guards can enforce `required_scopes`
|
|
6
|
+
// without polluting the user identity type.
|
|
1
7
|
export function customJwtPayloadToUserData(payload) {
|
|
2
8
|
return {
|
|
3
9
|
uid: payload.uid,
|
|
@@ -9,4 +15,15 @@ export function customJwtPayloadToUserData(payload) {
|
|
|
9
15
|
created_at: payload.created_at,
|
|
10
16
|
};
|
|
11
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Extracts the granted scope claim from a decoded custom-JWT payload, to be
|
|
20
|
+
* carried alongside the UserData. Returns null when the token has no scope
|
|
21
|
+
* claim (issued before scopes became first-class), which route guards treat
|
|
22
|
+
* as "no scopes granted".
|
|
23
|
+
*/
|
|
24
|
+
export function getScopeFromCustomJwtPayload(payload) {
|
|
25
|
+
return typeof payload.scope === "string" && payload.scope.length > 0
|
|
26
|
+
? payload.scope
|
|
27
|
+
: null;
|
|
28
|
+
}
|
|
12
29
|
//# sourceMappingURL=custom-jwt-payload-to-user-data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-jwt-payload-to-user-data.js","sourceRoot":"","sources":["../../src/jwt/custom-jwt-payload-to-user-data.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CACxC,OAAyB;IAEzB,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"custom-jwt-payload-to-user-data.js","sourceRoot":"","sources":["../../src/jwt/custom-jwt-payload-to-user-data.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,sEAAsE;AACtE,sEAAsE;AACtE,8DAA8D;AAC9D,0EAA0E;AAC1E,4CAA4C;AAC5C,MAAM,UAAU,0BAA0B,CACxC,OAAyB;IAEzB,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAyB;IAEzB,OAAO,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAClE,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
|
package/dist/jwt/generate.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ interface BaseGenerateJWTOptions<T extends AuthTokenTypes> {
|
|
|
10
10
|
audience: string;
|
|
11
11
|
auth_server_url: string;
|
|
12
12
|
env: SchemaVaultsAppEnvironment;
|
|
13
|
+
/**
|
|
14
|
+
* Space-delimited granted OIDC scopes; set only by the OIDC surface
|
|
15
|
+
* (see payload_data.ts). Omitted on all other tokens.
|
|
16
|
+
*/
|
|
17
|
+
scope?: string;
|
|
13
18
|
}
|
|
14
19
|
interface GenerateJWTWithAllKeysOptions<T extends AuthTokenTypes> extends BaseGenerateJWTOptions<T> {
|
|
15
20
|
jwt_keys: I_JWT_Keys;
|
package/dist/jwt/generate.js
CHANGED
|
@@ -152,6 +152,9 @@ export async function generateJWT({ type, user, iat, client_app_id, audience, au
|
|
|
152
152
|
env,
|
|
153
153
|
sig,
|
|
154
154
|
jti,
|
|
155
|
+
...(typeof opts.scope === "string" && opts.scope.length > 0
|
|
156
|
+
? { scope: opts.scope }
|
|
157
|
+
: {}),
|
|
155
158
|
};
|
|
156
159
|
const jwt = await new EncryptJWT(additionalClaims)
|
|
157
160
|
.setProtectedHeader({
|
package/dist/jwt/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/jwt/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASlE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,8BAA8B,GAE/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,WAAW,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/jwt/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
2
|
+
import type { UserData } from "@schemavaults/auth-common";
|
|
3
|
+
import type { I_JWT_Keys } from "./jwt_keys";
|
|
4
|
+
/**
|
|
5
|
+
* OIDC id_token lifetime in seconds. Deliberately short-lived: the
|
|
6
|
+
* id_token is an identity assertion consumed by the RP at login time,
|
|
7
|
+
* not an access credential.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ID_TOKEN_EXPIRY: 3600;
|
|
10
|
+
export interface GenerateIdTokenOptions {
|
|
11
|
+
user: UserData;
|
|
12
|
+
/** The OIDC client_id (= platform app_id) — becomes the `aud` claim. */
|
|
13
|
+
client_id: string;
|
|
14
|
+
/** Echoed verbatim as the `nonce` claim when present (OIDC Core §2). */
|
|
15
|
+
nonce?: string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Granted OIDC scopes; `email`/`email_verified` claims are only
|
|
18
|
+
* included when the `email` scope was granted.
|
|
19
|
+
*/
|
|
20
|
+
scopes: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* Keyset whose RS256 signing key signs the id_token. Its public
|
|
23
|
+
* verification half must be published at the OIDC jwks_uri under the
|
|
24
|
+
* kid `<keyset_id>-verification`.
|
|
25
|
+
*/
|
|
26
|
+
jwt_keys: I_JWT_Keys;
|
|
27
|
+
environment: SchemaVaultsAppEnvironment;
|
|
28
|
+
auth_server_url?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface GeneratedIdToken {
|
|
31
|
+
id_token: string;
|
|
32
|
+
/** Seconds until expiry (= ID_TOKEN_EXPIRY). */
|
|
33
|
+
expires_in: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Mints an OIDC Core §2 id_token: a plain RS256-signed JWS (NOT the
|
|
37
|
+
* platform's encrypted JWE access-token format) that any relying party
|
|
38
|
+
* can verify against the public JWKS. The `kid` header follows the
|
|
39
|
+
* platform convention (`<keyset_id>-verification`) so it matches the
|
|
40
|
+
* keys served by the jwks_uri.
|
|
41
|
+
*/
|
|
42
|
+
export declare function generateIdToken({ user, client_id, nonce, scopes, jwt_keys, environment, auth_server_url, }: GenerateIdTokenOptions): Promise<GeneratedIdToken>;
|
|
43
|
+
export default generateIdToken;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { SignJWT } from "jose";
|
|
2
|
+
import { getAuthServerUrl, } from "@schemavaults/app-definitions";
|
|
3
|
+
import signAndVerifyAlg from "./sign_verify_alg";
|
|
4
|
+
import isValidUuid from "../utils/isValidUuid";
|
|
5
|
+
/**
|
|
6
|
+
* OIDC id_token lifetime in seconds. Deliberately short-lived: the
|
|
7
|
+
* id_token is an identity assertion consumed by the RP at login time,
|
|
8
|
+
* not an access credential.
|
|
9
|
+
*/
|
|
10
|
+
export const ID_TOKEN_EXPIRY = 3600;
|
|
11
|
+
/**
|
|
12
|
+
* Mints an OIDC Core §2 id_token: a plain RS256-signed JWS (NOT the
|
|
13
|
+
* platform's encrypted JWE access-token format) that any relying party
|
|
14
|
+
* can verify against the public JWKS. The `kid` header follows the
|
|
15
|
+
* platform convention (`<keyset_id>-verification`) so it matches the
|
|
16
|
+
* keys served by the jwks_uri.
|
|
17
|
+
*/
|
|
18
|
+
export async function generateIdToken({ user, client_id, nonce, scopes, jwt_keys, environment, auth_server_url = getAuthServerUrl(environment), }) {
|
|
19
|
+
if (typeof user?.uid !== "string" || user.uid.length === 0) {
|
|
20
|
+
throw new TypeError("generateIdToken requires a user with a uid!");
|
|
21
|
+
}
|
|
22
|
+
if (typeof client_id !== "string" || client_id.length === 0) {
|
|
23
|
+
throw new TypeError("generateIdToken requires a client_id!");
|
|
24
|
+
}
|
|
25
|
+
if (typeof auth_server_url !== "string" || auth_server_url.length === 0) {
|
|
26
|
+
throw new TypeError("Failed to resolve auth server URL to be used as the id_token 'iss' claim!");
|
|
27
|
+
}
|
|
28
|
+
const keyset_id = jwt_keys.keyset_id;
|
|
29
|
+
if (typeof keyset_id !== "string" || !isValidUuid(keyset_id)) {
|
|
30
|
+
throw new TypeError("Invalid keyset ID on the provided JWT keys!");
|
|
31
|
+
}
|
|
32
|
+
const signing_key_promise = jwt_keys.signing_key;
|
|
33
|
+
if (!signing_key_promise) {
|
|
34
|
+
throw new Error("Failed to load private signing key from the provided JWT keys!");
|
|
35
|
+
}
|
|
36
|
+
const signing_key = await signing_key_promise;
|
|
37
|
+
const claims = {};
|
|
38
|
+
if (typeof nonce === "string" && nonce.length > 0) {
|
|
39
|
+
claims.nonce = nonce;
|
|
40
|
+
}
|
|
41
|
+
if (scopes.includes("email")) {
|
|
42
|
+
claims.email = user.email;
|
|
43
|
+
claims.email_verified = user.email_verified ?? false;
|
|
44
|
+
}
|
|
45
|
+
const id_token = await new SignJWT(claims)
|
|
46
|
+
.setProtectedHeader({
|
|
47
|
+
alg: signAndVerifyAlg,
|
|
48
|
+
typ: "JWT",
|
|
49
|
+
kid: `${keyset_id}-verification`,
|
|
50
|
+
})
|
|
51
|
+
.setIssuer(auth_server_url)
|
|
52
|
+
.setSubject(user.uid)
|
|
53
|
+
.setAudience(client_id)
|
|
54
|
+
// jose defaults to the current unix time in SECONDS; do not pass
|
|
55
|
+
// Date.now() here (milliseconds) like sign.ts does for the internal
|
|
56
|
+
// `sig` JWS — OIDC RP libraries validate iat/exp as seconds.
|
|
57
|
+
.setIssuedAt()
|
|
58
|
+
.setExpirationTime(`${ID_TOKEN_EXPIRY}s`)
|
|
59
|
+
.sign(signing_key);
|
|
60
|
+
return { id_token, expires_in: ID_TOKEN_EXPIRY };
|
|
61
|
+
}
|
|
62
|
+
export default generateIdToken;
|
|
63
|
+
//# sourceMappingURL=generate_id_token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate_id_token.js","sourceRoot":"","sources":["../../src/jwt/generate_id_token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AAC/C,OAAO,EACL,gBAAgB,GAEjB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,gBAAgB,MAAM,mBAAmB,CAAC;AACjD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAa,CAAC;AA6B7C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,IAAI,EACJ,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,WAAW,EACX,eAAe,GAAG,gBAAgB,CAAC,WAAW,CAAC,GACxB;IACvB,IAAI,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CACjB,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAW,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,mBAAmB,GAA8B,QAAQ,CAAC,WAAW,CAAC;IAC5E,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAc,MAAM,mBAAmB,CAAC;IAEzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAW,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;SAC/C,kBAAkB,CAAC;QAClB,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,GAAG,SAAS,eAAe;KACjC,CAAC;SACD,SAAS,CAAC,eAAe,CAAC;SAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,WAAW,CAAC,SAAS,CAAC;QACvB,iEAAiE;QACjE,oEAAoE;QACpE,6DAA6D;SAC5D,WAAW,EAAE;SACb,iBAAiB,CAAC,GAAG,eAAe,GAAG,CAAC;SACxC,IAAI,CAAC,WAAW,CAAC,CAAC;IAErB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AACnD,CAAC;AAED,eAAe,eAAe,CAAC"}
|
package/dist/jwt/index.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ export { decodeJWT } from "./decode";
|
|
|
2
2
|
export { getExpiryTime, getExpiryDurationString } from "./expiry";
|
|
3
3
|
export { JWT_Factory } from "./jwt-factory";
|
|
4
4
|
export type { CustomJWTPayload } from "./payload_data";
|
|
5
|
-
export { customJwtPayloadToUserData } from "./custom-jwt-payload-to-user-data";
|
|
6
|
-
export { JWT_Keys, generateNewJwtKeySet, generateJwtSigningKeyPair, generateJwtContentEncryptionKeyPair, to_public_jwks, importAsymmetricJWK, jsonSerializedJwtKeySchema, PEMFormat, ContentEncryptionKeyPairFactory, SigningKeyPairFactory, } from "./jwt_keys";
|
|
5
|
+
export { customJwtPayloadToUserData, getScopeFromCustomJwtPayload, } from "./custom-jwt-payload-to-user-data";
|
|
6
|
+
export { JWT_Keys, generateNewJwtKeySet, generateJwtSigningKeyPair, generateJwtContentEncryptionKeyPair, to_public_jwks, to_public_verification_jwks, importAsymmetricJWK, jsonSerializedJwtKeySchema, PEMFormat, ContentEncryptionKeyPairFactory, SigningKeyPairFactory, } from "./jwt_keys";
|
|
7
7
|
export type * from "./jwt_keys";
|
|
8
|
+
export { generateIdToken, ID_TOKEN_EXPIRY } from "./generate_id_token";
|
|
9
|
+
export type { GenerateIdTokenOptions, GeneratedIdToken, } from "./generate_id_token";
|
|
8
10
|
export { getKeysetIdFromToken } from "./get_keyset_id_from_token";
|
|
9
11
|
export { default as getAudienceFromToken } from "./get_audience_from_token";
|
|
10
12
|
export { refreshTokenExpiry, accessTokenExpiry } from "./expiry";
|
package/dist/jwt/index.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
export { decodeJWT } from "./decode";
|
|
3
3
|
export { getExpiryTime, getExpiryDurationString } from "./expiry";
|
|
4
4
|
export { JWT_Factory } from "./jwt-factory";
|
|
5
|
-
export { customJwtPayloadToUserData } from "./custom-jwt-payload-to-user-data";
|
|
6
|
-
export { JWT_Keys, generateNewJwtKeySet, generateJwtSigningKeyPair, generateJwtContentEncryptionKeyPair, to_public_jwks, importAsymmetricJWK, jsonSerializedJwtKeySchema, PEMFormat, ContentEncryptionKeyPairFactory, SigningKeyPairFactory, } from "./jwt_keys";
|
|
5
|
+
export { customJwtPayloadToUserData, getScopeFromCustomJwtPayload, } from "./custom-jwt-payload-to-user-data";
|
|
6
|
+
export { JWT_Keys, generateNewJwtKeySet, generateJwtSigningKeyPair, generateJwtContentEncryptionKeyPair, to_public_jwks, to_public_verification_jwks, importAsymmetricJWK, jsonSerializedJwtKeySchema, PEMFormat, ContentEncryptionKeyPairFactory, SigningKeyPairFactory, } from "./jwt_keys";
|
|
7
|
+
export { generateIdToken, ID_TOKEN_EXPIRY } from "./generate_id_token";
|
|
7
8
|
export { getKeysetIdFromToken } from "./get_keyset_id_from_token";
|
|
8
9
|
export { default as getAudienceFromToken } from "./get_audience_from_token";
|
|
9
10
|
export { refreshTokenExpiry, accessTokenExpiry } from "./expiry";
|
package/dist/jwt/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jwt/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jwt/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,yBAAyB,EACzB,mCAAmC,EACnC,cAAc,EACd,2BAA2B,EAC3B,mBAAmB,EACnB,0BAA0B,EAC1B,SAAS,EACT,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEjE,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAGnE,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -23,8 +23,12 @@ export declare class JWT_Factory {
|
|
|
23
23
|
private get uid();
|
|
24
24
|
private static get iat();
|
|
25
25
|
private generate;
|
|
26
|
-
refresh(
|
|
27
|
-
|
|
26
|
+
refresh(opts?: {
|
|
27
|
+
scope?: string;
|
|
28
|
+
}): Promise<RefreshToken>;
|
|
29
|
+
access(audience: string, opts?: {
|
|
30
|
+
scope?: string;
|
|
31
|
+
}): Promise<AccessToken>;
|
|
28
32
|
private multipleAccessTokens;
|
|
29
33
|
/**
|
|
30
34
|
*
|
package/dist/jwt/jwt-factory.js
CHANGED
|
@@ -53,7 +53,7 @@ export class JWT_Factory {
|
|
|
53
53
|
static get iat() {
|
|
54
54
|
return Date.now();
|
|
55
55
|
}
|
|
56
|
-
async generate(type, aud) {
|
|
56
|
+
async generate(type, aud, opts) {
|
|
57
57
|
// Make sure the token type is valid
|
|
58
58
|
if (type !== "refresh" && type !== "access") {
|
|
59
59
|
throw new Error("Invalid token type");
|
|
@@ -90,15 +90,16 @@ export class JWT_Factory {
|
|
|
90
90
|
auth_server_url: this.auth_server_url,
|
|
91
91
|
jwt_keys: this.jwt_keys,
|
|
92
92
|
env: this.environment,
|
|
93
|
+
...(opts?.scope ? { scope: opts.scope } : {}),
|
|
93
94
|
};
|
|
94
95
|
const jwt = await generateJWT(generateTokenOptions);
|
|
95
96
|
return jwt;
|
|
96
97
|
}
|
|
97
|
-
async refresh() {
|
|
98
|
-
return await this.generate("refresh", this.auth_server_url);
|
|
98
|
+
async refresh(opts) {
|
|
99
|
+
return await this.generate("refresh", this.auth_server_url, opts);
|
|
99
100
|
}
|
|
100
|
-
async access(audience) {
|
|
101
|
-
return await this.generate("access", audience);
|
|
101
|
+
async access(audience, opts) {
|
|
102
|
+
return await this.generate("access", audience, opts);
|
|
102
103
|
}
|
|
103
104
|
async multipleAccessTokens(audiences) {
|
|
104
105
|
const accessTokens = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-factory.js","sourceRoot":"","sources":["../../src/jwt/jwt-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAOL,oBAAoB,EAEpB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,WAAW,EAGX,gCAAgC,EAChC,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAA2B,WAAW,EAAE,MAAM,YAAY,CAAC;AAWlE,wDAAwD;AACxD,0FAA0F;AAC1F,yFAAyF;AACzF,MAAM,OAAO,WAAW;IACtB;;;OAGG;IACc,aAAa,CAAQ;IACrB,IAAI,CAAW;IACf,WAAW,CAA6B;IACxC,eAAe,CAAS;IACxB,QAAQ,CAAa;IACrB,kBAAkB,CAA4B;IAE/D,YAAmB,IAA+B;QAChD,iBAAiB;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtB,oBAAoB;QACpB,MAAM,oBAAoB,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC;QAE/C,WAAW;QACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,yDAAyD;QACzD,MAAM,sBAAsB,GAAG,gCAAgC,CAAC,SAAS,CACvE,IAAI,CAAC,WAAgD,CACtD,CAAC;QACF,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,qEAAqE,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnI,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC;QAE/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAC;QACJ,CAAC;aAAM,IACL,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAC5B,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,IAAI,KAAK,QAAQ;YACxB,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAC/C,EACD,CAAC;YACD,MAAM,IAAI,SAAS,CACjB,0GAA0G,CAC3G,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAElD,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,IAAY,GAAG;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,kDAAkD,OAAO,IAAI,CAAC,GAAG,EAAE,CACpE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACvB,CAAC;IAEO,MAAM,KAAK,GAAG;QACpB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,IAAO,EACP,GAAW;
|
|
1
|
+
{"version":3,"file":"jwt-factory.js","sourceRoot":"","sources":["../../src/jwt/jwt-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export { ContentEncryptionKeyPairFactory } from "./ContentEncryptionKeyPairFacto
|
|
|
6
6
|
export { SigningKeyPairFactory } from "./SigningKeyPairFactory";
|
|
7
7
|
export { generateNewJwtKeySet, generateJwtContentEncryptionKeyPair, generateJwtSigningKeyPair, } from "./generate_new_jwt_keyset";
|
|
8
8
|
export { to_public_jwks } from "./to_public_jwks";
|
|
9
|
+
export { to_public_verification_jwks } from "./to_public_verification_jwks";
|
|
9
10
|
export type { JWK } from "./JWK";
|
|
10
11
|
export type { JWKS } from "./JWKS";
|
|
11
12
|
export { importAsymmetricJWK } from "./importAsymmetricJWK";
|
|
@@ -6,6 +6,7 @@ export { ContentEncryptionKeyPairFactory } from "./ContentEncryptionKeyPairFacto
|
|
|
6
6
|
export { SigningKeyPairFactory } from "./SigningKeyPairFactory";
|
|
7
7
|
export { generateNewJwtKeySet, generateJwtContentEncryptionKeyPair, generateJwtSigningKeyPair, } from "./generate_new_jwt_keyset";
|
|
8
8
|
export { to_public_jwks } from "./to_public_jwks";
|
|
9
|
+
export { to_public_verification_jwks } from "./to_public_verification_jwks";
|
|
9
10
|
export { importAsymmetricJWK } from "./importAsymmetricJWK";
|
|
10
11
|
export { PEMFormat } from "./pem-format";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sEAAsE;AAEtE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sEAAsE;AAEtE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAI5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { I_JWT_Keys } from "../../jwt/jwt_keys";
|
|
2
|
+
import { type JWK } from "jose";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a PUBLIC JWKS document containing ONLY the RS256 verification
|
|
5
|
+
* (public) keys of the given keysets — the shape a spec-compliant OIDC
|
|
6
|
+
* `jwks_uri` must serve.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately separate from `to_public_jwks`, which also exports each
|
|
9
|
+
* keyset's private RSA DECRYPTION key: that document exists for the
|
|
10
|
+
* access-gated per-audience JWKS exchange with trusted resource servers
|
|
11
|
+
* (which must decrypt the platform's JWE tokens) and must never be
|
|
12
|
+
* served on a public endpoint.
|
|
13
|
+
*/
|
|
14
|
+
export declare function to_public_verification_jwks(active_keysets: I_JWT_Keys | readonly I_JWT_Keys[]): Promise<{
|
|
15
|
+
keys: readonly JWK[];
|
|
16
|
+
}>;
|
|
17
|
+
export default to_public_verification_jwks;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { exportJWK } from "jose";
|
|
2
|
+
import getAlgorithmForKey from "./getAlgorithmForKey";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a PUBLIC JWKS document containing ONLY the RS256 verification
|
|
5
|
+
* (public) keys of the given keysets — the shape a spec-compliant OIDC
|
|
6
|
+
* `jwks_uri` must serve.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately separate from `to_public_jwks`, which also exports each
|
|
9
|
+
* keyset's private RSA DECRYPTION key: that document exists for the
|
|
10
|
+
* access-gated per-audience JWKS exchange with trusted resource servers
|
|
11
|
+
* (which must decrypt the platform's JWE tokens) and must never be
|
|
12
|
+
* served on a public endpoint.
|
|
13
|
+
*/
|
|
14
|
+
export async function to_public_verification_jwks(active_keysets) {
|
|
15
|
+
const keysets = Array.isArray(active_keysets)
|
|
16
|
+
? active_keysets
|
|
17
|
+
: [active_keysets];
|
|
18
|
+
const output_jwks = [];
|
|
19
|
+
for (const keyset of keysets) {
|
|
20
|
+
const keyset_id = keyset.keyset_id;
|
|
21
|
+
if (keyset.keyset_expiry && keyset.keyset_expiry < Date.now()) {
|
|
22
|
+
// don't use any keys from this expired keyset
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const keys_in_set = keyset.listSerializedKeys();
|
|
26
|
+
for (const key of keys_in_set) {
|
|
27
|
+
if (key.key_type !== "verification") {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (key.privacy_level !== "public") {
|
|
31
|
+
throw new Error(`Verification key in keyset '${keyset_id}' is not marked public!`);
|
|
32
|
+
}
|
|
33
|
+
if (key.keyset_id !== keyset_id) {
|
|
34
|
+
throw new Error(`Keyset '${keyset_id}' contains a key that is not part of it!`);
|
|
35
|
+
}
|
|
36
|
+
const jose_activated_key = await keyset.verification_key;
|
|
37
|
+
const jwk = await exportJWK(jose_activated_key);
|
|
38
|
+
output_jwks.push({
|
|
39
|
+
...jwk,
|
|
40
|
+
kid: `${keyset_id}-verification`,
|
|
41
|
+
alg: getAlgorithmForKey(key),
|
|
42
|
+
use: "sig",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const keys = output_jwks;
|
|
47
|
+
if (keys.length === 0) {
|
|
48
|
+
console.warn("[to_public_verification_jwks] Output 'keys' array is empty!");
|
|
49
|
+
}
|
|
50
|
+
return { keys };
|
|
51
|
+
}
|
|
52
|
+
export default to_public_verification_jwks;
|
|
53
|
+
//# sourceMappingURL=to_public_verification_jwks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to_public_verification_jwks.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/to_public_verification_jwks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAY,MAAM,MAAM,CAAC;AAC3C,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,cAAkD;IAElD,MAAM,OAAO,GAA0B,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;QAClE,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAErB,MAAM,WAAW,GAAU,EAAE,CAAC;IAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAW,MAAM,CAAC,SAAS,CAAC;QAE3C,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9D,8CAA8C;YAC9C,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GACf,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,IAAI,GAAG,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,+BAA+B,SAAS,yBAAyB,CAClE,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,0CAA0C,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,kBAAkB,GAAc,MAAM,MAAM,CAAC,gBAAgB,CAAC;YACpE,MAAM,GAAG,GAAQ,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG,GAAG;gBACN,GAAG,EAAE,GAAG,SAAS,eAAe;gBAChC,GAAG,EAAE,kBAAkB,CAAC,GAAG,CAAC;gBAC5B,GAAG,EAAE,KAAK;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAmB,WAAW,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,eAAe,2BAA2B,CAAC"}
|
|
@@ -2,6 +2,7 @@ import type { z as zod } from "zod";
|
|
|
2
2
|
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
3
3
|
export declare function createJwtPayloadSchema(z: typeof zod, environment?: SchemaVaultsAppEnvironment): zod.ZodEffects<zod.ZodEffects<zod.ZodObject<{
|
|
4
4
|
sub: zod.ZodString;
|
|
5
|
+
sig: zod.ZodString;
|
|
5
6
|
uid: zod.ZodString;
|
|
6
7
|
email: zod.ZodString;
|
|
7
8
|
email_verified: zod.ZodBoolean;
|
|
@@ -10,13 +11,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
10
11
|
admin: zod.ZodBoolean;
|
|
11
12
|
disabled: zod.ZodBoolean;
|
|
12
13
|
created_at: zod.ZodEffects<zod.ZodNumber, number, number>;
|
|
13
|
-
sig: zod.ZodString;
|
|
14
14
|
iss: zod.ZodString;
|
|
15
15
|
env: zod.ZodEnum<["development", "staging", "test", "production"]>;
|
|
16
16
|
jti: zod.ZodOptional<zod.ZodString>;
|
|
17
17
|
iat: zod.ZodNumber;
|
|
18
|
+
scope: zod.ZodOptional<zod.ZodString>;
|
|
18
19
|
}, "strict", zod.ZodTypeAny, {
|
|
19
20
|
sub: string;
|
|
21
|
+
sig: string;
|
|
20
22
|
uid: string;
|
|
21
23
|
email: string;
|
|
22
24
|
email_verified: boolean;
|
|
@@ -25,13 +27,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
25
27
|
admin: boolean;
|
|
26
28
|
disabled: boolean;
|
|
27
29
|
created_at: number;
|
|
28
|
-
sig: string;
|
|
29
30
|
iss: string;
|
|
30
31
|
env: "development" | "staging" | "test" | "production";
|
|
31
32
|
iat: number;
|
|
32
33
|
jti?: string | undefined;
|
|
34
|
+
scope?: string | undefined;
|
|
33
35
|
}, {
|
|
34
36
|
sub: string;
|
|
37
|
+
sig: string;
|
|
35
38
|
uid: string;
|
|
36
39
|
email: string;
|
|
37
40
|
email_verified: boolean;
|
|
@@ -40,13 +43,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
40
43
|
admin: boolean;
|
|
41
44
|
disabled: boolean;
|
|
42
45
|
created_at: number;
|
|
43
|
-
sig: string;
|
|
44
46
|
iss: string;
|
|
45
47
|
env: "development" | "staging" | "test" | "production";
|
|
46
48
|
iat: number;
|
|
47
49
|
jti?: string | undefined;
|
|
50
|
+
scope?: string | undefined;
|
|
48
51
|
}>, {
|
|
49
52
|
sub: string;
|
|
53
|
+
sig: string;
|
|
50
54
|
uid: string;
|
|
51
55
|
email: string;
|
|
52
56
|
email_verified: boolean;
|
|
@@ -55,13 +59,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
55
59
|
admin: boolean;
|
|
56
60
|
disabled: boolean;
|
|
57
61
|
created_at: number;
|
|
58
|
-
sig: string;
|
|
59
62
|
iss: string;
|
|
60
63
|
env: "development" | "staging" | "test" | "production";
|
|
61
64
|
iat: number;
|
|
62
65
|
jti?: string | undefined;
|
|
66
|
+
scope?: string | undefined;
|
|
63
67
|
}, {
|
|
64
68
|
sub: string;
|
|
69
|
+
sig: string;
|
|
65
70
|
uid: string;
|
|
66
71
|
email: string;
|
|
67
72
|
email_verified: boolean;
|
|
@@ -70,13 +75,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
70
75
|
admin: boolean;
|
|
71
76
|
disabled: boolean;
|
|
72
77
|
created_at: number;
|
|
73
|
-
sig: string;
|
|
74
78
|
iss: string;
|
|
75
79
|
env: "development" | "staging" | "test" | "production";
|
|
76
80
|
iat: number;
|
|
77
81
|
jti?: string | undefined;
|
|
82
|
+
scope?: string | undefined;
|
|
78
83
|
}>, {
|
|
79
84
|
sub: string;
|
|
85
|
+
sig: string;
|
|
80
86
|
uid: string;
|
|
81
87
|
email: string;
|
|
82
88
|
email_verified: boolean;
|
|
@@ -85,13 +91,14 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
85
91
|
admin: boolean;
|
|
86
92
|
disabled: boolean;
|
|
87
93
|
created_at: number;
|
|
88
|
-
sig: string;
|
|
89
94
|
iss: string;
|
|
90
95
|
env: "development" | "staging" | "test" | "production";
|
|
91
96
|
iat: number;
|
|
92
97
|
jti?: string | undefined;
|
|
98
|
+
scope?: string | undefined;
|
|
93
99
|
}, {
|
|
94
100
|
sub: string;
|
|
101
|
+
sig: string;
|
|
95
102
|
uid: string;
|
|
96
103
|
email: string;
|
|
97
104
|
email_verified: boolean;
|
|
@@ -100,10 +107,10 @@ export declare function createJwtPayloadSchema(z: typeof zod, environment?: Sche
|
|
|
100
107
|
admin: boolean;
|
|
101
108
|
disabled: boolean;
|
|
102
109
|
created_at: number;
|
|
103
|
-
sig: string;
|
|
104
110
|
iss: string;
|
|
105
111
|
env: "development" | "staging" | "test" | "production";
|
|
106
112
|
iat: number;
|
|
107
113
|
jti?: string | undefined;
|
|
114
|
+
scope?: string | undefined;
|
|
108
115
|
}>;
|
|
109
116
|
export type CustomJWTPayload = zod.infer<ReturnType<typeof createJwtPayloadSchema>>;
|
package/dist/jwt/payload_data.js
CHANGED
|
@@ -22,6 +22,12 @@ export function createJwtPayloadSchema(z, environment = getAppEnvironment()) {
|
|
|
22
22
|
env: schemaVaultsAppEnvironmentSchema,
|
|
23
23
|
jti: z.string().uuid().optional(),
|
|
24
24
|
iat: z.number().nonnegative(), // unix seconds (jose's setIssuedAt output)
|
|
25
|
+
// Space-delimited granted scopes (RFC 6749 §3.3). Set on every
|
|
26
|
+
// access/refresh token issued since scopes became first-class;
|
|
27
|
+
// kept optional so tokens issued before then remain decodable
|
|
28
|
+
// until they expire. /api/oidc/userinfo filters its claims by it
|
|
29
|
+
// and route guards enforce `required_scopes` against it.
|
|
30
|
+
scope: z.string().max(256).optional(),
|
|
25
31
|
})
|
|
26
32
|
.required({
|
|
27
33
|
uid: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload_data.js","sourceRoot":"","sources":["../../src/jwt/payload_data.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,0BAA0B;AAC1B,MAAM,UAAU,sBAAsB,CACpC,CAAa,EACb,cAA0C,iBAAiB,EAAE;IAE7D,OAAO,CAAC;SACL,MAAM,CAAC;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QACzB,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,6FAA6F;QACxI,GAAG,EAAE,WAAW,EAAE,qFAAqF;QACvG,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM;QAC3B,oCAAoC;QACpC,CAAC,aAAa,EAAW,EAAE;YACzB,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,CAAmB,CAAC;QACzD,CAAC,EACD,yCAAyC,CAC1C;QACD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,gCAAgC;QACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,2CAA2C;
|
|
1
|
+
{"version":3,"file":"payload_data.js","sourceRoot":"","sources":["../../src/jwt/payload_data.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,0BAA0B;AAC1B,MAAM,UAAU,sBAAsB,CACpC,CAAa,EACb,cAA0C,iBAAiB,EAAE;IAE7D,OAAO,CAAC;SACL,MAAM,CAAC;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QACzB,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,6FAA6F;QACxI,GAAG,EAAE,WAAW,EAAE,qFAAqF;QACvG,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM;QAC3B,oCAAoC;QACpC,CAAC,aAAa,EAAW,EAAE;YACzB,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,CAAmB,CAAC;QACzD,CAAC,EACD,yCAAyC,CAC1C;QACD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,gCAAgC;QACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,2CAA2C;QAC1E,+DAA+D;QAC/D,+DAA+D;QAC/D,8DAA8D;QAC9D,iEAAiE;QACjE,yDAAyD;QACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACtC,CAAC;SACD,QAAQ,CAAC;QACR,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,IAAI;QACpB,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;KACV,CAAC;SACD,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;QACtB,OAAO,WAAW,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC;IAC7C,CAAC,EAAE,sCAAsC,CAAC;SACzC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;QACtB,IAAI,WAAW,CAAC,GAAG,KAAK,YAAY,IAAI,WAAW,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACtE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,8DAA8D,CAAC,CAAC;AACvE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schemavaults/jwt",
|
|
3
3
|
"description": "Utility functions for authentication and authorization for use from the auth server or a resource server",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.11.3",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"private": false,
|
|
7
7
|
"repository": {
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"zod": "3.25.8",
|
|
18
18
|
"jose": "6.1.3",
|
|
19
|
-
"@schemavaults/auth-common": "0.
|
|
20
|
-
"@schemavaults/app-definitions": "0.
|
|
19
|
+
"@schemavaults/auth-common": "0.22.3",
|
|
20
|
+
"@schemavaults/app-definitions": "0.11.4"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsc --project tsconfig.json && tsc-alias --project tsconfig.json",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"typecheck": "tsc --project tsconfig.json --noEmit"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"typescript": "
|
|
33
|
+
"typescript": "6.0.3",
|
|
34
34
|
"bun-types": "1.3.14",
|
|
35
|
-
"tsc-alias": "1.
|
|
35
|
+
"tsc-alias": "1.9.0",
|
|
36
36
|
"eslint": "9.39.1",
|
|
37
37
|
"@eslint/js": "9.39.1",
|
|
38
38
|
"globals": "16.5.0",
|