@schemavaults/jwt 0.7.32 → 0.7.34
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/JwksAccessProofToken/constants.d.ts +2 -0
- package/dist/JwksAccessProofToken/constants.js +18 -0
- package/dist/JwksAccessProofToken/constants.js.map +1 -0
- package/dist/JwksAccessProofToken/createJwksAccessProofToken.js +7 -2
- package/dist/JwksAccessProofToken/createJwksAccessProofToken.js.map +1 -1
- package/dist/JwksAccessProofToken/index.d.ts +1 -0
- package/dist/JwksAccessProofToken/index.js +1 -0
- package/dist/JwksAccessProofToken/index.js.map +1 -1
- package/dist/JwksAccessProofToken/verifyJwksAccessProofToken.js +4 -1
- package/dist/JwksAccessProofToken/verifyJwksAccessProofToken.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// JWKS access assertions are short-lived, single-use credentials: resource
|
|
2
|
+
// servers mint a fresh one immediately before each request to the auth
|
|
3
|
+
// server. Verification rejects assertions whose `iat` is older than this
|
|
4
|
+
// window (jose `maxTokenAge`), and the mint side uses the same value for
|
|
5
|
+
// `exp` so a token's self-declared lifetime matches the acceptance window.
|
|
6
|
+
export const JWKS_ACCESS_PROOF_TOKEN_MAX_AGE = "60s";
|
|
7
|
+
// Claims every JWKS access assertion must carry. Verification rejects
|
|
8
|
+
// tokens missing any of these (jose `requiredClaims`), so assertions minted
|
|
9
|
+
// without `jti`/`iat` cannot be accepted — and therefore cannot be replayed
|
|
10
|
+
// past the auth server's jti tracking.
|
|
11
|
+
export const JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS = [
|
|
12
|
+
"exp",
|
|
13
|
+
"iat",
|
|
14
|
+
"jti",
|
|
15
|
+
"aud",
|
|
16
|
+
"iss",
|
|
17
|
+
];
|
|
18
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/constants.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,CAAC;AAErD,sEAAsE;AACtE,4EAA4E;AAC5E,4EAA4E;AAC5E,uCAAuC;AACvC,MAAM,CAAC,MAAM,uCAAuC,GAAsB;IACxE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC"}
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import { sign_verify_alg } from "../jwt";
|
|
2
2
|
import { apiServerIdSchema, SCHEMAVAULTS_AUTH_APP_DEFINITION, SCHEMAVAULTS_AUTH_SERVER, } from "@schemavaults/app-definitions";
|
|
3
3
|
import { SignJWT } from "jose";
|
|
4
|
+
import { JWKS_ACCESS_PROOF_TOKEN_MAX_AGE } from "./constants";
|
|
4
5
|
export async function createJwksAccessProofToken({ api_server_id, private_key, }) {
|
|
5
|
-
if (!apiServerIdSchema.safeParse(api_server_id)) {
|
|
6
|
+
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
6
7
|
throw new TypeError("Invalid API server ID!");
|
|
7
8
|
}
|
|
8
9
|
if (api_server_id === SCHEMAVAULTS_AUTH_SERVER.api_server_id) {
|
|
9
10
|
throw new Error(`'${SCHEMAVAULTS_AUTH_SERVER.api_server_id}' does not use JWKS access proof tokens`);
|
|
10
11
|
}
|
|
12
|
+
// The auth server requires exp, iat, jti, aud, and iss claims, and treats
|
|
13
|
+
// each jti as single-use, so mint a fresh assertion for every request.
|
|
11
14
|
const token_builder = new SignJWT({
|
|
12
15
|
api_server_id,
|
|
13
16
|
})
|
|
14
17
|
.setSubject(api_server_id)
|
|
15
18
|
.setIssuer(api_server_id)
|
|
16
19
|
.setAudience(SCHEMAVAULTS_AUTH_APP_DEFINITION.app_id)
|
|
20
|
+
.setJti(crypto.randomUUID())
|
|
21
|
+
.setIssuedAt()
|
|
17
22
|
.setNotBefore(new Date(Date.now() - 1))
|
|
18
|
-
.setExpirationTime(
|
|
23
|
+
.setExpirationTime(JWKS_ACCESS_PROOF_TOKEN_MAX_AGE)
|
|
19
24
|
.setProtectedHeader({
|
|
20
25
|
alg: sign_verify_alg,
|
|
21
26
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/createJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAEL,iBAAiB,EACjB,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"createJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/createJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAEL,iBAAiB,EACjB,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAO9D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,aAAa,EACb,WAAW,GACiB;IAC5B,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,aAAa,KAAK,wBAAwB,CAAC,aAAa,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,IAAI,wBAAwB,CAAC,aAAa,yCAAyC,CACpF,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC;QAChC,aAAa;KACd,CAAC;SACC,UAAU,CAAC,aAAa,CAAC;SACzB,SAAS,CAAC,aAAa,CAAC;SACxB,WAAW,CAAC,gCAAgC,CAAC,MAAM,CAAC;SACpD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;SAC3B,WAAW,EAAE;SACb,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACtC,iBAAiB,CAAC,+BAA+B,CAAC;SAClD,kBAAkB,CAAC;QAClB,GAAG,EAAE,eAAe;KACrB,CAAC,CAAC;IAEL,OAAO,MAAM,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { verifyJwksAccessProofToken } from "./verifyJwksAccessProofToken";
|
|
2
2
|
export { createJwksAccessProofToken } from "./createJwksAccessProofToken";
|
|
3
|
+
export { JWKS_ACCESS_PROOF_TOKEN_MAX_AGE, JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS, } from "./constants";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EACL,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,aAAa,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { apiServerIdSchema, SCHEMAVAULTS_AUTH_APP_DEFINITION, SCHEMAVAULTS_AUTH_SERVER, } from "@schemavaults/app-definitions";
|
|
2
2
|
import { jwtVerify } from "jose";
|
|
3
3
|
import signVerifyAlg, { sign_verify_alg } from "../jwt/sign_verify_alg";
|
|
4
|
+
import { JWKS_ACCESS_PROOF_TOKEN_MAX_AGE, JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS, } from "./constants";
|
|
4
5
|
export async function verifyJwksAccessProofToken({ token, api_server_id, public_key, }) {
|
|
5
6
|
if (typeof token !== "string") {
|
|
6
7
|
throw new TypeError("Expected token to verify to be a string!");
|
|
7
8
|
}
|
|
8
|
-
if (!apiServerIdSchema.safeParse(api_server_id)) {
|
|
9
|
+
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
9
10
|
throw new TypeError("Invalid API server ID!");
|
|
10
11
|
}
|
|
11
12
|
if (api_server_id === SCHEMAVAULTS_AUTH_SERVER.api_server_id) {
|
|
@@ -16,6 +17,8 @@ export async function verifyJwksAccessProofToken({ token, api_server_id, public_
|
|
|
16
17
|
issuer: api_server_id,
|
|
17
18
|
subject: api_server_id,
|
|
18
19
|
algorithms: [signVerifyAlg],
|
|
20
|
+
maxTokenAge: JWKS_ACCESS_PROOF_TOKEN_MAX_AGE,
|
|
21
|
+
requiredClaims: [...JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS],
|
|
19
22
|
});
|
|
20
23
|
if (payload.payload.aud !== SCHEMAVAULTS_AUTH_APP_DEFINITION.app_id) {
|
|
21
24
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/verifyJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,aAAa,EAAE,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"verifyJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/verifyJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,aAAa,EAAE,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,aAAa,CAAC;AAQrB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,KAAK,EACL,aAAa,EACb,UAAU,GACkB;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,aAAa,KAAK,wBAAwB,CAAC,aAAa,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,IAAI,wBAAwB,CAAC,aAAa,yCAAyC,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE;QACjD,QAAQ,EAAE,gCAAgC,CAAC,MAAM;QACjD,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,CAAC,aAAa,CAAC;QAC3B,WAAW,EAAE,+BAA+B;QAC5C,cAAc,EAAE,CAAC,GAAG,uCAAuC,CAAC;KAC7D,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,gCAAgC,CAAC,MAAM,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IACE,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,aAAa;QACrC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,aAAa,EACrC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,eAAe,0BAA0B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from "./jwt";
|
|
2
2
|
export type * from "./jwt";
|
|
3
|
-
export { createJwksAccessProofToken, verifyJwksAccessProofToken, } from "./JwksAccessProofToken";
|
|
3
|
+
export { createJwksAccessProofToken, verifyJwksAccessProofToken, JWKS_ACCESS_PROOF_TOKEN_MAX_AGE, JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS, } from "./JwksAccessProofToken";
|
|
4
4
|
export { isValidBase64UrlEncoding } from "./utils/isValidBase64UrlEncoding";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @schemavaults/jwt - index.ts
|
|
2
2
|
export * from "./jwt";
|
|
3
|
-
export { createJwksAccessProofToken, verifyJwksAccessProofToken, } from "./JwksAccessProofToken";
|
|
3
|
+
export { createJwksAccessProofToken, verifyJwksAccessProofToken, JWKS_ACCESS_PROOF_TOKEN_MAX_AGE, JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS, } from "./JwksAccessProofToken";
|
|
4
4
|
export { isValidBase64UrlEncoding } from "./utils/isValidBase64UrlEncoding";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,OAAO,CAAC;AAGtB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,OAAO,CAAC;AAGtB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,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.7.
|
|
4
|
+
"version": "0.7.34",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"private": false,
|
|
7
7
|
"repository": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"zod": "3.25.8",
|
|
18
18
|
"jose": "6.1.3",
|
|
19
|
-
"@schemavaults/auth-common": "0.13.
|
|
19
|
+
"@schemavaults/auth-common": "0.13.2",
|
|
20
20
|
"@schemavaults/app-definitions": "0.7.1"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|