@schemavaults/jwt 0.7.34 → 0.8.4
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/createJwksAccessProofToken.d.ts +2 -1
- package/dist/JwksAccessProofToken/createJwksAccessProofToken.js +5 -5
- package/dist/JwksAccessProofToken/createJwksAccessProofToken.js.map +1 -1
- package/dist/JwksAccessProofToken/verifyJwksAccessProofToken.d.ts +2 -1
- package/dist/JwksAccessProofToken/verifyJwksAccessProofToken.js +6 -6
- package/dist/JwksAccessProofToken/verifyJwksAccessProofToken.js.map +1 -1
- package/dist/jwt/decode.d.ts +1 -0
- package/dist/jwt/decode.js +23 -14
- package/dist/jwt/decode.js.map +1 -1
- package/dist/jwt/generate.d.ts +2 -1
- package/dist/jwt/generate.js +19 -12
- package/dist/jwt/generate.js.map +1 -1
- package/dist/jwt/get_audience_from_token.d.ts +2 -1
- package/dist/jwt/get_audience_from_token.js +5 -4
- package/dist/jwt/get_audience_from_token.js.map +1 -1
- package/dist/jwt/get_refresh_token_audience.d.ts +2 -0
- package/dist/jwt/get_refresh_token_audience.js +5 -0
- package/dist/jwt/get_refresh_token_audience.js.map +1 -0
- package/dist/jwt/jwt-factory.d.ts +2 -2
- package/dist/jwt/jwt-factory.js +13 -13
- package/dist/jwt/jwt-factory.js.map +1 -1
- package/dist/jwt/jwt_keys/JsonSerializedJwtKey.d.ts +1 -1
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.d.ts +2 -0
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js +14 -4
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js.map +1 -1
- package/dist/jwt/payload_data.d.ts +53 -22
- package/dist/jwt/payload_data.js +52 -44
- package/dist/jwt/payload_data.js.map +1 -1
- package/dist/jwt/sign.d.ts +3 -2
- package/dist/jwt/sign.js +15 -8
- package/dist/jwt/sign.js.map +1 -1
- package/dist/jwt/verify_signature.d.ts +3 -2
- package/dist/jwt/verify_signature.js +13 -10
- package/dist/jwt/verify_signature.js.map +1 -1
- package/package.json +3 -3
- package/dist/jwt/aud.d.ts +0 -1
- package/dist/jwt/aud.js +0 -3
- package/dist/jwt/aud.js.map +0 -1
- package/dist/jwt/iss.d.ts +0 -1
- package/dist/jwt/iss.js +0 -3
- package/dist/jwt/iss.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type ApiServerId } from "@schemavaults/app-definitions";
|
|
2
2
|
export interface ICreateJwksAccessProofToken {
|
|
3
3
|
api_server_id: ApiServerId;
|
|
4
|
+
auth_server_url: string;
|
|
4
5
|
private_key: CryptoKey;
|
|
5
6
|
}
|
|
6
|
-
export declare function createJwksAccessProofToken({ api_server_id, private_key, }: ICreateJwksAccessProofToken): Promise<string>;
|
|
7
|
+
export declare function createJwksAccessProofToken({ api_server_id, auth_server_url, private_key, }: ICreateJwksAccessProofToken): Promise<string>;
|
|
7
8
|
export default createJwksAccessProofToken;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { sign_verify_alg } from "../jwt";
|
|
2
|
-
import { apiServerIdSchema,
|
|
2
|
+
import { apiServerIdSchema, } from "@schemavaults/app-definitions";
|
|
3
3
|
import { SignJWT } from "jose";
|
|
4
4
|
import { JWKS_ACCESS_PROOF_TOKEN_MAX_AGE } from "./constants";
|
|
5
|
-
export async function createJwksAccessProofToken({ api_server_id, private_key, }) {
|
|
5
|
+
export async function createJwksAccessProofToken({ api_server_id, auth_server_url, private_key, }) {
|
|
6
6
|
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
7
7
|
throw new TypeError("Invalid API server ID!");
|
|
8
8
|
}
|
|
9
|
-
if (api_server_id ===
|
|
10
|
-
throw new Error(`'${
|
|
9
|
+
if (api_server_id === auth_server_url) {
|
|
10
|
+
throw new Error(`'${auth_server_url}' does not use JWKS access proof tokens`);
|
|
11
11
|
}
|
|
12
12
|
// The auth server requires exp, iat, jti, aud, and iss claims, and treats
|
|
13
13
|
// each jti as single-use, so mint a fresh assertion for every request.
|
|
@@ -16,7 +16,7 @@ export async function createJwksAccessProofToken({ api_server_id, private_key, }
|
|
|
16
16
|
})
|
|
17
17
|
.setSubject(api_server_id)
|
|
18
18
|
.setIssuer(api_server_id)
|
|
19
|
-
.setAudience(
|
|
19
|
+
.setAudience(auth_server_url)
|
|
20
20
|
.setJti(crypto.randomUUID())
|
|
21
21
|
.setIssuedAt()
|
|
22
22
|
.setNotBefore(new Date(Date.now() - 1))
|
|
@@ -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,
|
|
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,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAQ9D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,aAAa,EACb,eAAe,EACf,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,eAAe,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,IAAI,eAAe,yCAAyC,CAC7D,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,eAAe,CAAC;SAC5B,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"}
|
|
@@ -2,7 +2,8 @@ import { type ApiServerId } from "@schemavaults/app-definitions";
|
|
|
2
2
|
export interface IVerifyJwksAccessProofToken {
|
|
3
3
|
token: string;
|
|
4
4
|
api_server_id: ApiServerId;
|
|
5
|
+
auth_server_url: string;
|
|
5
6
|
public_key: CryptoKey;
|
|
6
7
|
}
|
|
7
|
-
export declare function verifyJwksAccessProofToken({ token, api_server_id, public_key, }: IVerifyJwksAccessProofToken): Promise<boolean>;
|
|
8
|
+
export declare function verifyJwksAccessProofToken({ token, api_server_id, auth_server_url, public_key, }: IVerifyJwksAccessProofToken): Promise<boolean>;
|
|
8
9
|
export default verifyJwksAccessProofToken;
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { apiServerIdSchema,
|
|
1
|
+
import { apiServerIdSchema, } from "@schemavaults/app-definitions";
|
|
2
2
|
import { jwtVerify } from "jose";
|
|
3
3
|
import signVerifyAlg, { sign_verify_alg } from "../jwt/sign_verify_alg";
|
|
4
4
|
import { JWKS_ACCESS_PROOF_TOKEN_MAX_AGE, JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS, } from "./constants";
|
|
5
|
-
export async function verifyJwksAccessProofToken({ token, api_server_id, public_key, }) {
|
|
5
|
+
export async function verifyJwksAccessProofToken({ token, api_server_id, auth_server_url, public_key, }) {
|
|
6
6
|
if (typeof token !== "string") {
|
|
7
7
|
throw new TypeError("Expected token to verify to be a string!");
|
|
8
8
|
}
|
|
9
9
|
if (!apiServerIdSchema.safeParse(api_server_id).success) {
|
|
10
10
|
throw new TypeError("Invalid API server ID!");
|
|
11
11
|
}
|
|
12
|
-
if (api_server_id ===
|
|
13
|
-
throw new Error(`'${
|
|
12
|
+
if (api_server_id === auth_server_url) {
|
|
13
|
+
throw new Error(`'${auth_server_url}' does not use JWKS access proof tokens`);
|
|
14
14
|
}
|
|
15
15
|
const payload = await jwtVerify(token, public_key, {
|
|
16
|
-
audience:
|
|
16
|
+
audience: auth_server_url,
|
|
17
17
|
issuer: api_server_id,
|
|
18
18
|
subject: api_server_id,
|
|
19
19
|
algorithms: [signVerifyAlg],
|
|
20
20
|
maxTokenAge: JWKS_ACCESS_PROOF_TOKEN_MAX_AGE,
|
|
21
21
|
requiredClaims: [...JWKS_ACCESS_PROOF_TOKEN_REQUIRED_CLAIMS],
|
|
22
22
|
});
|
|
23
|
-
if (payload.payload.aud !==
|
|
23
|
+
if (payload.payload.aud !== auth_server_url) {
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
if (payload.payload.sub !== api_server_id ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/verifyJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,
|
|
1
|
+
{"version":3,"file":"verifyJwksAccessProofToken.js","sourceRoot":"","sources":["../../src/JwksAccessProofToken/verifyJwksAccessProofToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,GAClB,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;AASrB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,KAAK,EACL,aAAa,EACb,eAAe,EACf,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,eAAe,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,IAAI,eAAe,yCAAyC,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE;QACjD,QAAQ,EAAE,eAAe;QACzB,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,eAAe,EAAE,CAAC;QAC5C,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/jwt/decode.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ interface BaseDecodeJWTOptions<T extends AuthTokenTypes> {
|
|
|
7
7
|
type: T;
|
|
8
8
|
jwt: string;
|
|
9
9
|
audience?: string;
|
|
10
|
+
auth_server_url?: string;
|
|
10
11
|
env: SchemaVaultsAppEnvironment;
|
|
11
12
|
}
|
|
12
13
|
interface DecodeJWTWithAllKeysOptions<T extends AuthTokenTypes> extends BaseDecodeJWTOptions<T> {
|
package/dist/jwt/decode.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { jwtDecrypt, decodeProtectedHeader, } from "jose";
|
|
2
|
-
import
|
|
3
|
-
import { issuer } from "./iss";
|
|
2
|
+
import getRefreshTokenAudience from "./get_refresh_token_audience";
|
|
4
3
|
import { getExpiryDurationString } from "./expiry";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { createJwtPayloadSchema } from "./payload_data";
|
|
5
|
+
import { getAppEnvironment, getAuthServerUrl, schemaVaultsAppEnvironmentSchema, } from "@schemavaults/app-definitions";
|
|
6
|
+
import { createAudienceSchema } from "@schemavaults/auth-common";
|
|
7
7
|
import { verifyJWTSignature } from "./verify_signature";
|
|
8
|
+
import { z } from "zod";
|
|
8
9
|
import isValidUuid from "../utils/isValidUuid";
|
|
9
10
|
import encryptDecryptAlgorithm from "./encrypt_decrypt_alg";
|
|
10
11
|
export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
11
|
-
?
|
|
12
|
+
? getAuthServerUrl(getAppEnvironment())
|
|
12
13
|
: undefined, ...opts }) {
|
|
13
14
|
const environment = opts.env;
|
|
14
15
|
if (!environment) {
|
|
@@ -43,16 +44,20 @@ export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
|
43
44
|
if (typeof jwt !== "string") {
|
|
44
45
|
throw new Error("Invalid JWT; expected string");
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
const auth_server_url = typeof opts.auth_server_url === "string"
|
|
48
|
+
? opts.auth_server_url
|
|
49
|
+
: getAuthServerUrl(environment);
|
|
50
|
+
if (type === "refresh" && audience !== auth_server_url) {
|
|
48
51
|
if (debug) {
|
|
49
52
|
console.log("Invalid audience for refresh token: ", audience);
|
|
50
53
|
}
|
|
51
|
-
throw new Error(`Invalid audience for refresh token
|
|
54
|
+
throw new Error(`Invalid audience for refresh token!`, {
|
|
55
|
+
cause: `Only auth server URL ('${auth_server_url}') is valid.`,
|
|
56
|
+
});
|
|
52
57
|
}
|
|
53
58
|
let aud;
|
|
54
59
|
if (type === "refresh") {
|
|
55
|
-
aud =
|
|
60
|
+
aud = getRefreshTokenAudience(environment);
|
|
56
61
|
}
|
|
57
62
|
else if (type === "access") {
|
|
58
63
|
if (typeof audience !== "string") {
|
|
@@ -90,12 +95,14 @@ export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
|
90
95
|
}
|
|
91
96
|
if (!decoded_header.aud ||
|
|
92
97
|
typeof decoded_header.aud !== "string" ||
|
|
93
|
-
!
|
|
98
|
+
!createAudienceSchema(z, environment).safeParse(decoded_header.aud)
|
|
99
|
+
.success) {
|
|
94
100
|
throw new Error("Invalid audience in JWT header");
|
|
95
101
|
}
|
|
96
|
-
if (type === "refresh" &&
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
if (type === "refresh" && decoded_header.aud !== auth_server_url) {
|
|
103
|
+
throw new Error(`Invalid audience in JWT header for refresh token`, {
|
|
104
|
+
cause: `Only server audience ('${auth_server_url}') tokens are allowed here`,
|
|
105
|
+
});
|
|
99
106
|
}
|
|
100
107
|
if (decoded_header.aud !== audience) {
|
|
101
108
|
throw new Error(`Invalid audience in JWT header; only '${audience}' tokens are allowed here`);
|
|
@@ -132,7 +139,7 @@ export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
|
132
139
|
}
|
|
133
140
|
const decoded = await jwtDecrypt(jwt, decryption_key, {
|
|
134
141
|
audience: aud,
|
|
135
|
-
issuer,
|
|
142
|
+
issuer: auth_server_url,
|
|
136
143
|
maxTokenAge,
|
|
137
144
|
currentDate: decodeTime,
|
|
138
145
|
});
|
|
@@ -148,6 +155,7 @@ export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
|
148
155
|
}
|
|
149
156
|
const withoutJWTspecific = { ...decoded.payload };
|
|
150
157
|
delete withoutJWTspecific.exp;
|
|
158
|
+
const jwtPayloadSchema = createJwtPayloadSchema(z, environment);
|
|
151
159
|
const parsedPayload = await jwtPayloadSchema.safeParseAsync(withoutJWTspecific);
|
|
152
160
|
if (!parsedPayload.success) {
|
|
153
161
|
if (environment === "development") {
|
|
@@ -210,6 +218,7 @@ export async function decodeJWT({ type, jwt, audience = type === "refresh"
|
|
|
210
218
|
sub,
|
|
211
219
|
uid,
|
|
212
220
|
env: environment,
|
|
221
|
+
auth_server_url,
|
|
213
222
|
...(payload.jti ? { jti: payload.jti } : {}),
|
|
214
223
|
});
|
|
215
224
|
if (!isValidSig) {
|
package/dist/jwt/decode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/jwt/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,qBAAqB,GAEtB,MAAM,MAAM,CAAC;AAEd,OAAO,
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/jwt/decode.ts"],"names":[],"mappings":"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"}
|
package/dist/jwt/generate.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ interface BaseGenerateJWTOptions<T extends AuthTokenTypes> {
|
|
|
8
8
|
iat: number;
|
|
9
9
|
client_app_id: string;
|
|
10
10
|
audience: string;
|
|
11
|
+
auth_server_url: string;
|
|
11
12
|
env: SchemaVaultsAppEnvironment;
|
|
12
13
|
}
|
|
13
14
|
interface GenerateJWTWithAllKeysOptions<T extends AuthTokenTypes> extends BaseGenerateJWTOptions<T> {
|
|
@@ -26,5 +27,5 @@ export type GenerateJWTOptions<T extends AuthTokenTypes> = GenerateJWTWithAllKey
|
|
|
26
27
|
* @param iat Current unix timestamp
|
|
27
28
|
* @returns A JWT (AccessToken or RefreshToken object). The .token property contains the actual token as a string.
|
|
28
29
|
*/
|
|
29
|
-
export declare function generateJWT<T extends AuthTokenTypes>({ type, user, iat, client_app_id, audience, ...opts }: GenerateJWTOptions<T>, refresh_token_audience?:
|
|
30
|
+
export declare function generateJWT<T extends AuthTokenTypes>({ type, user, iat, client_app_id, audience, auth_server_url, ...opts }: GenerateJWTOptions<T>, refresh_token_audience?: string): Promise<T extends "access" ? AccessToken : RefreshToken>;
|
|
30
31
|
export {};
|
package/dist/jwt/generate.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { EncryptJWT } from "jose";
|
|
2
2
|
import { alg, enc } from "./encrypt_decrypt_alg";
|
|
3
|
-
import
|
|
4
|
-
import { REFRESH_TOKEN_AUDIENCE } from "./aud";
|
|
3
|
+
import getRefreshTokenAudience from "./get_refresh_token_audience";
|
|
5
4
|
import { getExpiryDurationString, getExpiryTime } from "./expiry";
|
|
6
5
|
import { signJWT } from "./sign";
|
|
7
|
-
import { apiServerIdSchema,
|
|
6
|
+
import { apiServerIdSchema, getTokenAudienceForApiServerId, } from "@schemavaults/app-definitions";
|
|
7
|
+
import { createAudienceSchema } from "@schemavaults/auth-common";
|
|
8
|
+
import { z } from "zod";
|
|
8
9
|
import isValidUuid from "../utils/isValidUuid";
|
|
9
10
|
/**
|
|
10
11
|
*
|
|
@@ -13,7 +14,7 @@ import isValidUuid from "../utils/isValidUuid";
|
|
|
13
14
|
* @param iat Current unix timestamp
|
|
14
15
|
* @returns A JWT (AccessToken or RefreshToken object). The .token property contains the actual token as a string.
|
|
15
16
|
*/
|
|
16
|
-
export async function generateJWT({ type, user, iat, client_app_id, audience, ...opts }, refresh_token_audience =
|
|
17
|
+
export async function generateJWT({ type, user, iat, client_app_id, audience, auth_server_url, ...opts }, refresh_token_audience = getRefreshTokenAudience(opts.env)) {
|
|
17
18
|
let keyset_id;
|
|
18
19
|
try {
|
|
19
20
|
if ("keyset_id" in opts) {
|
|
@@ -48,8 +49,8 @@ export async function generateJWT({ type, user, iat, client_app_id, audience, ..
|
|
|
48
49
|
if (typeof audience !== "string") {
|
|
49
50
|
throw new TypeError("An audience must be supplied for access tokens");
|
|
50
51
|
}
|
|
51
|
-
if (!
|
|
52
|
-
throw new TypeError("Invalid audience provided; not a valid
|
|
52
|
+
if (!createAudienceSchema(z, opts.env).safeParse(audience).success) {
|
|
53
|
+
throw new TypeError("Invalid audience provided; not a valid token audience!");
|
|
53
54
|
}
|
|
54
55
|
aud = audience;
|
|
55
56
|
}
|
|
@@ -62,16 +63,21 @@ export async function generateJWT({ type, user, iat, client_app_id, audience, ..
|
|
|
62
63
|
!apiServerIdSchema.safeParse(keyset_audience_id).success) {
|
|
63
64
|
throw new TypeError("Invalid audience ID for JWT keyset; not a valid API server ID!");
|
|
64
65
|
}
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
// The keyset is stored/looked-up by the stable api server id (e.g. the
|
|
67
|
+
// auth server's own app id), but the token `aud` claim uses the token
|
|
68
|
+
// audience form (the auth server URL). Translate before comparing.
|
|
69
|
+
const keyset_token_audience = getTokenAudienceForApiServerId(keyset_audience_id, opts.env);
|
|
70
|
+
if (keyset_token_audience !== aud) {
|
|
71
|
+
throw new Error(`JWT keyset audience ID '${keyset_audience_id}' (token audience '${keyset_token_audience}') does not match requested token audience '${aud}'`);
|
|
67
72
|
}
|
|
68
73
|
}
|
|
69
74
|
const email = user.email;
|
|
70
75
|
const uid = user.uid;
|
|
71
76
|
const env = opts.env;
|
|
72
|
-
if (type === "refresh" &&
|
|
73
|
-
audience
|
|
74
|
-
|
|
77
|
+
if (type === "refresh" && audience !== auth_server_url) {
|
|
78
|
+
throw new Error("Invalid audience for refresh token", {
|
|
79
|
+
cause: `Only auth server URL audience ('${auth_server_url}') is valid for refresh tokens.`,
|
|
80
|
+
});
|
|
75
81
|
}
|
|
76
82
|
const jti = crypto.randomUUID();
|
|
77
83
|
let signing_key;
|
|
@@ -105,6 +111,7 @@ export async function generateJWT({ type, user, iat, client_app_id, audience, ..
|
|
|
105
111
|
email,
|
|
106
112
|
type,
|
|
107
113
|
env,
|
|
114
|
+
auth_server_url,
|
|
108
115
|
jti,
|
|
109
116
|
});
|
|
110
117
|
}
|
|
@@ -155,7 +162,7 @@ export async function generateJWT({ type, user, iat, client_app_id, audience, ..
|
|
|
155
162
|
aud: audience,
|
|
156
163
|
})
|
|
157
164
|
.setIssuedAt(new Date(iat))
|
|
158
|
-
.setIssuer(
|
|
165
|
+
.setIssuer(auth_server_url)
|
|
159
166
|
.setAudience(aud)
|
|
160
167
|
.setExpirationTime(getExpiryDurationString(type))
|
|
161
168
|
.setSubject(userData.uid)
|
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,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/jwt/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
2
|
+
export default function getAudienceFromToken(token: string, environment?: SchemaVaultsAppEnvironment): string;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createAudienceSchema } from "@schemavaults/auth-common";
|
|
2
2
|
import { decodeProtectedHeader } from "jose";
|
|
3
|
-
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export default function getAudienceFromToken(token, environment) {
|
|
4
5
|
const headers = decodeProtectedHeader(token);
|
|
5
6
|
if ("aud" in headers) {
|
|
6
7
|
if (typeof headers.aud === "string" && headers.aud.length > 0) {
|
|
7
8
|
const aud = headers.aud;
|
|
8
|
-
if (!
|
|
9
|
-
throw new Error("Invalid token; 'aud' claim must be a valid
|
|
9
|
+
if (!createAudienceSchema(z, environment).safeParse(aud).success) {
|
|
10
|
+
throw new Error("Invalid token; 'aud' claim must be a valid token audience");
|
|
10
11
|
}
|
|
11
12
|
return aud;
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_audience_from_token.js","sourceRoot":"","sources":["../../src/jwt/get_audience_from_token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get_audience_from_token.js","sourceRoot":"","sources":["../../src/jwt/get_audience_from_token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,KAAa,EACb,WAAwC;IAExC,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QACrB,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAW,OAAO,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { getAppEnvironment, getAuthServerUrl, } from "@schemavaults/app-definitions";
|
|
2
|
+
export default function getRefreshTokenAudience(environment = getAppEnvironment()) {
|
|
3
|
+
return getAuthServerUrl(environment);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=get_refresh_token_audience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_refresh_token_audience.js","sourceRoot":"","sources":["../../src/jwt/get_refresh_token_audience.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,cAA0C,iBAAiB,EAAE;IAE7D,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -15,9 +15,9 @@ export declare class JWT_Factory {
|
|
|
15
15
|
*/
|
|
16
16
|
private readonly client_app_id;
|
|
17
17
|
private readonly user;
|
|
18
|
-
private static readonly REFRESH_TOKEN_AUDIENCE;
|
|
19
|
-
private readonly jwt_keys;
|
|
20
18
|
private readonly environment;
|
|
19
|
+
private readonly auth_server_url;
|
|
20
|
+
private readonly jwt_keys;
|
|
21
21
|
private readonly user_organizations;
|
|
22
22
|
constructor(opts: IJWT_Factory_Init_Options);
|
|
23
23
|
private get uid();
|
package/dist/jwt/jwt-factory.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createAudienceSchema, organizationIdSchema, } from "@schemavaults/auth-common";
|
|
3
|
+
import { appIdSchema, schemaVaultsAppEnvironmentSchema, schemaVaultsAppEnvironments, getAuthServerUrl, } from "@schemavaults/app-definitions";
|
|
3
4
|
import { generateJWT } from "./generate";
|
|
4
|
-
import { REFRESH_TOKEN_AUDIENCE } from "./aud";
|
|
5
5
|
// This class is used to generate JWTs for a single user
|
|
6
6
|
// Initialize the factory with a user ID, then call loadUserData() to load the user's data
|
|
7
7
|
// Once the user's data is loaded, you can call refresh() or access() to generate a token
|
|
@@ -12,9 +12,9 @@ export class JWT_Factory {
|
|
|
12
12
|
*/
|
|
13
13
|
client_app_id;
|
|
14
14
|
user;
|
|
15
|
-
static REFRESH_TOKEN_AUDIENCE = REFRESH_TOKEN_AUDIENCE;
|
|
16
|
-
jwt_keys;
|
|
17
15
|
environment;
|
|
16
|
+
auth_server_url;
|
|
17
|
+
jwt_keys;
|
|
18
18
|
user_organizations;
|
|
19
19
|
constructor(opts) {
|
|
20
20
|
// Save user data
|
|
@@ -41,6 +41,7 @@ export class JWT_Factory {
|
|
|
41
41
|
throw new TypeError("Invalid user organizations, expected 'user_organizations' field to be an array of valid organization IDs");
|
|
42
42
|
}
|
|
43
43
|
this.user_organizations = opts.user_organizations;
|
|
44
|
+
this.auth_server_url = getAuthServerUrl(this.environment);
|
|
44
45
|
}
|
|
45
46
|
get uid() {
|
|
46
47
|
const user = this.user;
|
|
@@ -67,16 +68,15 @@ export class JWT_Factory {
|
|
|
67
68
|
const iat = JWT_Factory.iat;
|
|
68
69
|
if (type === "refresh") {
|
|
69
70
|
// refresh tokens are always addressed to the auth server
|
|
70
|
-
if (aud !==
|
|
71
|
-
|
|
72
|
-
throw new Error("Refresh tokens must have an audience directed at the SchemaVaults Auth platform");
|
|
71
|
+
if (aud !== this.auth_server_url) {
|
|
72
|
+
throw new Error("Refresh tokens must have an audience directed at the SchemaVaults Auth Server URL");
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
else if (aud ===
|
|
76
|
-
// Always allow audience to be the
|
|
75
|
+
else if (type === "access" && aud === this.auth_server_url) {
|
|
76
|
+
// Always allow audience to be the auth server
|
|
77
77
|
}
|
|
78
78
|
else {
|
|
79
|
-
const parsed_as_uuid_aud = await
|
|
79
|
+
const parsed_as_uuid_aud = await createAudienceSchema(z, this.environment).safeParseAsync(aud);
|
|
80
80
|
if (!parsed_as_uuid_aud.success) {
|
|
81
81
|
throw new Error("Expected audience to reference a valid app, API, or FS server!");
|
|
82
82
|
}
|
|
@@ -87,6 +87,7 @@ export class JWT_Factory {
|
|
|
87
87
|
iat,
|
|
88
88
|
audience: aud,
|
|
89
89
|
client_app_id: this.client_app_id,
|
|
90
|
+
auth_server_url: this.auth_server_url,
|
|
90
91
|
jwt_keys: this.jwt_keys,
|
|
91
92
|
env: this.environment,
|
|
92
93
|
};
|
|
@@ -94,8 +95,7 @@ export class JWT_Factory {
|
|
|
94
95
|
return jwt;
|
|
95
96
|
}
|
|
96
97
|
async refresh() {
|
|
97
|
-
|
|
98
|
-
return await this.generate("refresh", REFRESH_TOKEN_AUDIENCE);
|
|
98
|
+
return await this.generate("refresh", this.auth_server_url);
|
|
99
99
|
}
|
|
100
100
|
async access(audience) {
|
|
101
101
|
return await this.generate("access", audience);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-factory.js","sourceRoot":"","sources":["../../src/jwt/jwt-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,
|
|
1
|
+
{"version":3,"file":"jwt-factory.js","sourceRoot":"","sources":["../../src/jwt/jwt-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const jsonSerializedJwtKeySchema: z.ZodEffects<z.ZodObject<{
|
|
3
|
-
audience_id: z.
|
|
3
|
+
audience_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
4
4
|
keyset_id: z.ZodString;
|
|
5
5
|
keyset_expiry: z.ZodOptional<z.ZodNumber>;
|
|
6
6
|
value: z.ZodString;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
1
2
|
import JWT_Keys from "./jwt_keys";
|
|
2
3
|
/**
|
|
3
4
|
* @name generateJwtSigningKeyPair
|
|
@@ -13,6 +14,7 @@ export declare function generateJwtSigningKeyPair(debug?: boolean): Promise<[pri
|
|
|
13
14
|
export declare function generateJwtContentEncryptionKeyPair(debug?: boolean): Promise<[private_key: string, public_key: string]>;
|
|
14
15
|
export interface IGenerateNewJwtKeySetOpts {
|
|
15
16
|
audience_id: string;
|
|
17
|
+
environment: SchemaVaultsAppEnvironment;
|
|
16
18
|
keyset_id?: string;
|
|
17
19
|
keyset_expiry?: number;
|
|
18
20
|
debug?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apiServerIdSchema } from "@schemavaults/app-definitions";
|
|
1
|
+
import { apiServerIdSchema, } from "@schemavaults/app-definitions";
|
|
2
2
|
import ContentEncryptionKeyPairFactory from "./ContentEncryptionKeyPairFactory";
|
|
3
3
|
import JWT_Keys from "./jwt_keys";
|
|
4
4
|
import SigningKeyPairFactory from "./SigningKeyPairFactory";
|
|
@@ -37,10 +37,20 @@ export async function generateNewJwtKeySet(opts) {
|
|
|
37
37
|
const debug = opts?.debug || false;
|
|
38
38
|
const audience_id = opts.audience_id;
|
|
39
39
|
if (typeof audience_id !== "string") {
|
|
40
|
-
throw new TypeError(`Invalid audience ID: '${audience_id}'
|
|
40
|
+
throw new TypeError(`Invalid audience ID: '${audience_id}'`, {
|
|
41
|
+
cause: `Audience ID is not a string. Received type '${typeof audience_id}'.`,
|
|
42
|
+
});
|
|
41
43
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
// Keysets are stored and looked up by the stable api server id (e.g. the
|
|
45
|
+
// auth server's own app id, or a resource API server UUID).
|
|
46
|
+
// The URL only appears in token `aud` claims, derived from this id via getTokenAudienceForApiServerId().
|
|
47
|
+
const parsedAudience = apiServerIdSchema.safeParse(audience_id);
|
|
48
|
+
if (!parsedAudience.success) {
|
|
49
|
+
throw new TypeError(`Invalid audience ID: '${audience_id}'.` +
|
|
50
|
+
" " +
|
|
51
|
+
`Should be a valid API server ID.`, {
|
|
52
|
+
cause: parsedAudience.error,
|
|
53
|
+
});
|
|
44
54
|
}
|
|
45
55
|
if (typeof opts?.keyset_id === "string") {
|
|
46
56
|
if (!isValidUuid(opts.keyset_id)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate_new_jwt_keyset.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/generate_new_jwt_keyset.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"generate_new_jwt_keyset.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/generate_new_jwt_keyset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import type { z as zod } from "zod";
|
|
2
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
3
|
+
export declare function createJwtPayloadSchema(z: typeof zod, environment?: SchemaVaultsAppEnvironment): zod.ZodEffects<zod.ZodEffects<zod.ZodObject<{
|
|
4
|
+
sub: zod.ZodString;
|
|
5
|
+
uid: zod.ZodString;
|
|
6
|
+
email: zod.ZodString;
|
|
7
|
+
email_verified: zod.ZodBoolean;
|
|
8
|
+
aud: zod.ZodUnion<[zod.ZodEffects<zod.ZodString, string, string>, zod.ZodEffects<zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>, string, string>]>;
|
|
9
|
+
app: zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>;
|
|
10
|
+
admin: zod.ZodBoolean;
|
|
11
|
+
disabled: zod.ZodBoolean;
|
|
12
|
+
created_at: zod.ZodEffects<zod.ZodNumber, number, number>;
|
|
13
|
+
sig: zod.ZodString;
|
|
14
|
+
iss: zod.ZodString;
|
|
15
|
+
env: zod.ZodEnum<["development", "staging", "test", "production"]>;
|
|
16
|
+
jti: zod.ZodOptional<zod.ZodString>;
|
|
17
|
+
iat: zod.ZodNumber;
|
|
18
|
+
}, "strict", zod.ZodTypeAny, {
|
|
18
19
|
sub: string;
|
|
19
20
|
uid: string;
|
|
20
21
|
email: string;
|
|
@@ -25,7 +26,7 @@ export declare const jwtPayloadSchema: z.ZodEffects<z.ZodObject<{
|
|
|
25
26
|
disabled: boolean;
|
|
26
27
|
created_at: number;
|
|
27
28
|
sig: string;
|
|
28
|
-
iss:
|
|
29
|
+
iss: string;
|
|
29
30
|
env: "development" | "staging" | "test" | "production";
|
|
30
31
|
iat: number;
|
|
31
32
|
jti?: string | undefined;
|
|
@@ -40,7 +41,7 @@ export declare const jwtPayloadSchema: z.ZodEffects<z.ZodObject<{
|
|
|
40
41
|
disabled: boolean;
|
|
41
42
|
created_at: number;
|
|
42
43
|
sig: string;
|
|
43
|
-
iss:
|
|
44
|
+
iss: string;
|
|
44
45
|
env: "development" | "staging" | "test" | "production";
|
|
45
46
|
iat: number;
|
|
46
47
|
jti?: string | undefined;
|
|
@@ -55,7 +56,7 @@ export declare const jwtPayloadSchema: z.ZodEffects<z.ZodObject<{
|
|
|
55
56
|
disabled: boolean;
|
|
56
57
|
created_at: number;
|
|
57
58
|
sig: string;
|
|
58
|
-
iss:
|
|
59
|
+
iss: string;
|
|
59
60
|
env: "development" | "staging" | "test" | "production";
|
|
60
61
|
iat: number;
|
|
61
62
|
jti?: string | undefined;
|
|
@@ -70,9 +71,39 @@ export declare const jwtPayloadSchema: z.ZodEffects<z.ZodObject<{
|
|
|
70
71
|
disabled: boolean;
|
|
71
72
|
created_at: number;
|
|
72
73
|
sig: string;
|
|
73
|
-
iss:
|
|
74
|
+
iss: string;
|
|
75
|
+
env: "development" | "staging" | "test" | "production";
|
|
76
|
+
iat: number;
|
|
77
|
+
jti?: string | undefined;
|
|
78
|
+
}>, {
|
|
79
|
+
sub: string;
|
|
80
|
+
uid: string;
|
|
81
|
+
email: string;
|
|
82
|
+
email_verified: boolean;
|
|
83
|
+
aud: string;
|
|
84
|
+
app: string;
|
|
85
|
+
admin: boolean;
|
|
86
|
+
disabled: boolean;
|
|
87
|
+
created_at: number;
|
|
88
|
+
sig: string;
|
|
89
|
+
iss: string;
|
|
90
|
+
env: "development" | "staging" | "test" | "production";
|
|
91
|
+
iat: number;
|
|
92
|
+
jti?: string | undefined;
|
|
93
|
+
}, {
|
|
94
|
+
sub: string;
|
|
95
|
+
uid: string;
|
|
96
|
+
email: string;
|
|
97
|
+
email_verified: boolean;
|
|
98
|
+
aud: string;
|
|
99
|
+
app: string;
|
|
100
|
+
admin: boolean;
|
|
101
|
+
disabled: boolean;
|
|
102
|
+
created_at: number;
|
|
103
|
+
sig: string;
|
|
104
|
+
iss: string;
|
|
74
105
|
env: "development" | "staging" | "test" | "production";
|
|
75
106
|
iat: number;
|
|
76
107
|
jti?: string | undefined;
|
|
77
108
|
}>;
|
|
78
|
-
export type CustomJWTPayload =
|
|
109
|
+
export type CustomJWTPayload = zod.infer<ReturnType<typeof createJwtPayloadSchema>>;
|
package/dist/jwt/payload_data.js
CHANGED
|
@@ -1,46 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { appIdSchema, schemaVaultsAppEnvironmentSchema, } from "@schemavaults/app-definitions";
|
|
4
|
-
import { audienceRefSchema } from "@schemavaults/auth-common";
|
|
1
|
+
import { appIdSchema, getAppEnvironment, schemaVaultsAppEnvironmentSchema, } from "@schemavaults/app-definitions";
|
|
2
|
+
import { createAudienceSchema } from "@schemavaults/auth-common";
|
|
5
3
|
// Data to hold in the JWT
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
4
|
+
export function createJwtPayloadSchema(z, environment = getAppEnvironment()) {
|
|
5
|
+
return z
|
|
6
|
+
.object({
|
|
7
|
+
uid: z.string().uuid(),
|
|
8
|
+
sub: z.string().uuid(),
|
|
9
|
+
email: z.string().email(),
|
|
10
|
+
email_verified: z.boolean(),
|
|
11
|
+
aud: createAudienceSchema(z, environment), // Backend resource API UUID, either auth server url or a registered api server's unique UUID
|
|
12
|
+
app: appIdSchema, // Frontend client app UUID, either auth server url or a registered app's unique UUID
|
|
13
|
+
admin: z.boolean(),
|
|
14
|
+
disabled: z.boolean(),
|
|
15
|
+
created_at: z.number().refine(
|
|
16
|
+
// What time the user was created at
|
|
17
|
+
(creation_time) => {
|
|
18
|
+
return (creation_time <= Date.now());
|
|
19
|
+
}, "Creation time must not be in the future"),
|
|
20
|
+
sig: z.string().min(32).max(4096),
|
|
21
|
+
iss: z.string().url(),
|
|
22
|
+
env: schemaVaultsAppEnvironmentSchema,
|
|
23
|
+
jti: z.string().uuid().optional(),
|
|
24
|
+
iat: z.number().nonnegative(), // unix seconds (jose's setIssuedAt output)
|
|
25
|
+
})
|
|
26
|
+
.required({
|
|
27
|
+
uid: true,
|
|
28
|
+
sub: true,
|
|
29
|
+
email: true,
|
|
30
|
+
email_verified: true,
|
|
31
|
+
aud: true,
|
|
32
|
+
app: true,
|
|
33
|
+
admin: true,
|
|
34
|
+
disabled: true,
|
|
35
|
+
created_at: true,
|
|
36
|
+
sig: true,
|
|
37
|
+
iss: true,
|
|
38
|
+
env: true,
|
|
39
|
+
iat: true,
|
|
40
|
+
})
|
|
41
|
+
.strict()
|
|
42
|
+
.refine((jwt_payload) => {
|
|
43
|
+
return jwt_payload.sub === jwt_payload.uid;
|
|
44
|
+
}, "Token subject does not match user ID")
|
|
45
|
+
.refine((jwt_payload) => {
|
|
46
|
+
if (jwt_payload.env === "production" || jwt_payload.env === "staging") {
|
|
47
|
+
if (!jwt_payload.iss.startsWith("https://")) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}, "Issuer must use HTTPS in production or staging environments!");
|
|
53
|
+
}
|
|
46
54
|
//# sourceMappingURL=payload_data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload_data.js","sourceRoot":"","sources":["../../src/jwt/payload_data.ts"],"names":[],"mappings":"
|
|
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;KAC3E,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/dist/jwt/sign.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CryptoKey } from "jose";
|
|
2
2
|
import JWT_Keys from "./jwt_keys";
|
|
3
3
|
import type { AuthTokenTypes } from "@schemavaults/auth-common";
|
|
4
|
-
import type
|
|
4
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
5
5
|
interface BaseSignJSONWebTokenInputOptions<TokenType extends AuthTokenTypes> {
|
|
6
6
|
iat: number;
|
|
7
7
|
uid: string;
|
|
@@ -9,6 +9,7 @@ interface BaseSignJSONWebTokenInputOptions<TokenType extends AuthTokenTypes> {
|
|
|
9
9
|
audience: string;
|
|
10
10
|
type: TokenType;
|
|
11
11
|
env: SchemaVaultsAppEnvironment;
|
|
12
|
+
auth_server_url?: string;
|
|
12
13
|
jti?: string;
|
|
13
14
|
}
|
|
14
15
|
interface SignJSONWebTokenInputWithAllKeysOptions<TokenType extends AuthTokenTypes> extends BaseSignJSONWebTokenInputOptions<TokenType> {
|
|
@@ -19,5 +20,5 @@ interface SignJSONWebTokenInputWithSigningCryptoKeyOptions<TokenType extends Aut
|
|
|
19
20
|
keyset_id: string;
|
|
20
21
|
}
|
|
21
22
|
export type SignJSONWebTokenInputOptions<TokenType extends AuthTokenTypes> = SignJSONWebTokenInputWithAllKeysOptions<TokenType> | SignJSONWebTokenInputWithSigningCryptoKeyOptions<TokenType>;
|
|
22
|
-
export declare function signJWT<TokenType extends AuthTokenTypes>(opts: SignJSONWebTokenInputOptions<TokenType>): Promise<string>;
|
|
23
|
+
export declare function signJWT<TokenType extends AuthTokenTypes>({ type, uid, env, auth_server_url, ...opts }: SignJSONWebTokenInputOptions<TokenType>): Promise<string>;
|
|
23
24
|
export {};
|
package/dist/jwt/sign.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { SignJWT } from "jose";
|
|
2
2
|
import JWT_Keys from "./jwt_keys";
|
|
3
|
-
import { issuer } from "./iss";
|
|
4
3
|
import { getExpiryDurationString } from "./expiry";
|
|
4
|
+
import { getAuthServerUrl, } from "@schemavaults/app-definitions";
|
|
5
5
|
import signAndVerifyAlg from "./sign_verify_alg";
|
|
6
6
|
import isValidUuid from "../utils/isValidUuid";
|
|
7
|
-
export async function signJWT(opts) {
|
|
8
|
-
const type = opts.type;
|
|
9
|
-
const uid = opts.uid;
|
|
7
|
+
export async function signJWT({ type, uid, env, auth_server_url = getAuthServerUrl(env), ...opts }) {
|
|
10
8
|
const sub = uid;
|
|
11
9
|
if (typeof uid !== "string" || typeof sub !== "string" || uid !== sub) {
|
|
12
10
|
throw new Error("uid and sub must be defined and equal strings");
|
|
13
11
|
}
|
|
14
|
-
const env = opts.env;
|
|
15
12
|
let private_signing_key;
|
|
16
13
|
let keyset_id;
|
|
17
14
|
try {
|
|
@@ -36,8 +33,18 @@ export async function signJWT(opts) {
|
|
|
36
33
|
console.error("Failed to load private signing key from key store or input options: ", e);
|
|
37
34
|
throw new Error("Failed to load private signing key from key store or input options!");
|
|
38
35
|
}
|
|
39
|
-
if (
|
|
40
|
-
throw new
|
|
36
|
+
if (typeof keyset_id !== "string") {
|
|
37
|
+
throw new TypeError("Invalid keyset ID provided!", {
|
|
38
|
+
cause: `'keyset_id' is not a string! Received type '${typeof keyset_id}'.`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else if (!isValidUuid(keyset_id)) {
|
|
42
|
+
throw new TypeError("Invalid keyset ID provided!", {
|
|
43
|
+
cause: `'keyset_id' is not a valid UUID!`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (typeof auth_server_url !== "string" || auth_server_url.length === 0) {
|
|
47
|
+
throw new TypeError("Failed to resolve auth server URL to be used as 'iss' claim!");
|
|
41
48
|
}
|
|
42
49
|
const signaturePayload = {
|
|
43
50
|
sub,
|
|
@@ -55,7 +62,7 @@ export async function signJWT(opts) {
|
|
|
55
62
|
})
|
|
56
63
|
.setAudience(opts.audience)
|
|
57
64
|
.setIssuedAt(opts.iat)
|
|
58
|
-
.setIssuer(
|
|
65
|
+
.setIssuer(auth_server_url)
|
|
59
66
|
.setExpirationTime(getExpiryDurationString(type))
|
|
60
67
|
.sign(private_signing_key);
|
|
61
68
|
}
|
package/dist/jwt/sign.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/jwt/sign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,OAAO,EAAE,MAAM,MAAM,CAAC;AAChE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/jwt/sign.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CryptoKey } from "jose";
|
|
2
2
|
import { JWT_Keys } from "./jwt_keys";
|
|
3
3
|
import type { AuthTokenTypes } from "@schemavaults/auth-common";
|
|
4
|
-
import type
|
|
4
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
5
5
|
interface BaseVerifyJWTSignatureInputOptions<TokenType extends AuthTokenTypes> {
|
|
6
6
|
jwt: string;
|
|
7
7
|
aud: string;
|
|
@@ -10,6 +10,7 @@ interface BaseVerifyJWTSignatureInputOptions<TokenType extends AuthTokenTypes> {
|
|
|
10
10
|
sub: string;
|
|
11
11
|
uid: string;
|
|
12
12
|
env: SchemaVaultsAppEnvironment;
|
|
13
|
+
auth_server_url?: string;
|
|
13
14
|
jti?: string;
|
|
14
15
|
}
|
|
15
16
|
interface VerifyJWTSignatureInputWithAllKeysOptions<TokenType extends AuthTokenTypes> extends BaseVerifyJWTSignatureInputOptions<TokenType> {
|
|
@@ -20,5 +21,5 @@ interface VerifyJWTSignatureInputWithVerificationKeyOptions<TokenType extends Au
|
|
|
20
21
|
keyset_id: string;
|
|
21
22
|
}
|
|
22
23
|
export type VerifyJWTSignatureInputOptions<TokenType extends AuthTokenTypes> = VerifyJWTSignatureInputWithAllKeysOptions<TokenType> | VerifyJWTSignatureInputWithVerificationKeyOptions<TokenType>;
|
|
23
|
-
export declare function verifyJWTSignature<TokenType extends AuthTokenTypes>({ jwt, ...opts }: VerifyJWTSignatureInputOptions<TokenType>): Promise<boolean>;
|
|
24
|
+
export declare function verifyJWTSignature<TokenType extends AuthTokenTypes>({ jwt, env, auth_server_url, ...opts }: VerifyJWTSignatureInputOptions<TokenType>): Promise<boolean>;
|
|
24
25
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { jwtVerify, decodeProtectedHeader } from "jose";
|
|
1
|
+
import { jwtVerify, decodeProtectedHeader, } from "jose";
|
|
2
2
|
import { JWT_Keys } from "./jwt_keys";
|
|
3
|
-
import {
|
|
3
|
+
import { getAuthServerUrl, } from "@schemavaults/app-definitions";
|
|
4
4
|
import isValidUuid from "../utils/isValidUuid";
|
|
5
|
-
import signVerifyAlg from
|
|
6
|
-
export async function verifyJWTSignature({ jwt, ...opts }) {
|
|
5
|
+
import signVerifyAlg from "./sign_verify_alg";
|
|
6
|
+
export async function verifyJWTSignature({ jwt, env, auth_server_url = getAuthServerUrl(env), ...opts }) {
|
|
7
7
|
if (typeof opts.aud !== "string") {
|
|
8
8
|
console.error("Did not receive an audience option!");
|
|
9
9
|
return false;
|
|
@@ -38,11 +38,11 @@ export async function verifyJWTSignature({ jwt, ...opts }) {
|
|
|
38
38
|
let kid;
|
|
39
39
|
try {
|
|
40
40
|
const header = decodeProtectedHeader(jwt);
|
|
41
|
-
if (!header.alg || typeof header.alg !==
|
|
41
|
+
if (!header.alg || typeof header.alg !== "string") {
|
|
42
42
|
throw new Error("Missing 'alg' claim in protected header!");
|
|
43
43
|
}
|
|
44
44
|
alg = header.alg;
|
|
45
|
-
if (!header.kid || typeof header.kid !==
|
|
45
|
+
if (!header.kid || typeof header.kid !== "string") {
|
|
46
46
|
throw new Error("Missing 'kid' claim in protected header!");
|
|
47
47
|
}
|
|
48
48
|
kid = header.kid;
|
|
@@ -60,20 +60,23 @@ export async function verifyJWTSignature({ jwt, ...opts }) {
|
|
|
60
60
|
if (kid !== `${keyset_id}-verification`) {
|
|
61
61
|
throw new Error("Invalid key id; mismatch between 'kid' in header and key ID associated with verification key!");
|
|
62
62
|
}
|
|
63
|
+
if (typeof auth_server_url !== "string" || auth_server_url.length === 0) {
|
|
64
|
+
throw new TypeError("Missing 'auth_server_url' to use as 'iss' claim verifier!");
|
|
65
|
+
}
|
|
63
66
|
try {
|
|
64
67
|
const verify_result = await jwtVerify(jwt, verification_key, {
|
|
65
68
|
audience: opts.aud,
|
|
66
|
-
issuer,
|
|
69
|
+
issuer: auth_server_url,
|
|
67
70
|
subject: opts.sub,
|
|
68
|
-
algorithms: [signVerifyAlg]
|
|
71
|
+
algorithms: [signVerifyAlg],
|
|
69
72
|
});
|
|
70
73
|
if (verify_result.payload.aud !== opts.aud) {
|
|
71
74
|
throw new Error("Decoded payload does not match input audience!");
|
|
72
75
|
}
|
|
73
|
-
if (verify_result.payload.iss !==
|
|
76
|
+
if (verify_result.payload.iss !== auth_server_url) {
|
|
74
77
|
throw new Error("Unexpected 'iss' claim in signature token!");
|
|
75
78
|
}
|
|
76
|
-
if (verify_result.payload.env !==
|
|
79
|
+
if (verify_result.payload.env !== env) {
|
|
77
80
|
throw new Error("App environment mismatch!");
|
|
78
81
|
}
|
|
79
82
|
if (opts.jti && verify_result.payload.jti !== opts.jti) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify_signature.js","sourceRoot":"","sources":["../../src/jwt/verify_signature.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"verify_signature.js","sourceRoot":"","sources":["../../src/jwt/verify_signature.ts"],"names":[],"mappings":"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"}
|
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.8.4",
|
|
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.16.1",
|
|
20
|
+
"@schemavaults/app-definitions": "0.10.0"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsc --project tsconfig.json && tsc-alias --project tsconfig.json",
|
package/dist/jwt/aud.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const REFRESH_TOKEN_AUDIENCE: "schemavaults-auth";
|
package/dist/jwt/aud.js
DELETED
package/dist/jwt/aud.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aud.js","sourceRoot":"","sources":["../../src/jwt/aud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAC,MAAM,CAAC"}
|
package/dist/jwt/iss.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const issuer: "schemavaults-auth";
|
package/dist/jwt/iss.js
DELETED
package/dist/jwt/iss.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"iss.js","sourceRoot":"","sources":["../../src/jwt/iss.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAE/C,MAAM,CAAC,MAAM,MAAM,GAAG,sBAAsB,CAAC"}
|