@bitblit/ratchet-common 4.0.429-alpha → 4.0.432-alpha

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.
@@ -0,0 +1,5 @@
1
+ import { ExpiredJwtHandling } from './expired-jwt-handling.js';
2
+ import { JwtTokenBase } from './jwt-token-base.js';
3
+ export declare class JwtDecodeOnlyRatchet {
4
+ static decodeTokenNoVerify<T extends JwtTokenBase>(token: string, expiredHandling?: ExpiredJwtHandling, inDecodeFuntion?: (val: string) => T): T;
5
+ }
@@ -0,0 +1,11 @@
1
+ import { jwtDecode } from 'jwt-decode';
2
+ import { JwtPayloadExpirationRatchet } from './jwt-payload-expiration-ratchet.js';
3
+ export class JwtDecodeOnlyRatchet {
4
+ static decodeTokenNoVerify(token, expiredHandling = 0, inDecodeFuntion) {
5
+ const decodeFunction = inDecodeFuntion ?? jwtDecode;
6
+ let decoded = decodeFunction(token);
7
+ decoded = JwtPayloadExpirationRatchet.processPayloadExpiration(decoded, expiredHandling);
8
+ return decoded;
9
+ }
10
+ }
11
+ //# sourceMappingURL=jwt-decode-only-ratchet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-decode-only-ratchet.js","sourceRoot":"","sources":["../../src/jwt/jwt-decode-only-ratchet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAWlF,MAAM,OAAO,oBAAoB;IACxB,MAAM,CAAC,mBAAmB,CAC/B,KAAa,EACb,mBAAoE,EACpE,eAAoC;QAEpC,MAAM,cAAc,GAAuB,eAAe,IAAI,SAAS,CAAC;QACxE,IAAI,OAAO,GAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,GAAG,2BAA2B,CAAC,wBAAwB,CAAI,OAAO,EAAE,eAAe,CAAC,CAAC;QAC5F,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { ExpiredJwtHandling } from './expired-jwt-handling.js';
2
+ import { JwtTokenBase } from './jwt-token-base.js';
3
+ export declare class JwtPayloadExpirationRatchet {
4
+ private static readonly EXPIRED_FLAG_NAME;
5
+ static processPayloadExpiration<T extends JwtTokenBase>(payload: T, expiredHandling: ExpiredJwtHandling): T;
6
+ static hasExpiredFlag(ob: any): boolean;
7
+ static removeExpiredFlag(ob: any): void;
8
+ }
@@ -0,0 +1,36 @@
1
+ import { Logger } from '../logger/logger.js';
2
+ import { DurationRatchet } from '../lang/duration-ratchet.js';
3
+ export class JwtPayloadExpirationRatchet {
4
+ static EXPIRED_FLAG_NAME = '__jwtServiceExpiredFlag';
5
+ static processPayloadExpiration(payload, expiredHandling) {
6
+ if (payload) {
7
+ const nowSeconds = Math.floor(Date.now() / 1000);
8
+ const expSeconds = payload?.exp && payload.exp > nowSeconds * 100 ? Math.floor(payload.exp / 1000) : payload?.exp;
9
+ const nbfSeconds = payload?.nbf && payload.nbf > nowSeconds * 100 ? Math.floor(payload.nbf / 1000) : payload?.nbf;
10
+ if ((expSeconds && nowSeconds >= expSeconds) || (nbfSeconds && nowSeconds <= nbfSeconds)) {
11
+ const age = nowSeconds - expSeconds;
12
+ Logger.debug('JWT token expired or before NBF : on %d, %s ago', payload.exp, DurationRatchet.formatMsDuration(age * 1000));
13
+ switch (expiredHandling) {
14
+ case 1:
15
+ throw new Error('JWT Token was expired');
16
+ case 2:
17
+ payload[JwtPayloadExpirationRatchet.EXPIRED_FLAG_NAME] = true;
18
+ break;
19
+ default:
20
+ payload = null;
21
+ break;
22
+ }
23
+ }
24
+ }
25
+ return payload;
26
+ }
27
+ static hasExpiredFlag(ob) {
28
+ return ob && ob[JwtPayloadExpirationRatchet.EXPIRED_FLAG_NAME] === true;
29
+ }
30
+ static removeExpiredFlag(ob) {
31
+ if (ob) {
32
+ delete ob[JwtPayloadExpirationRatchet.EXPIRED_FLAG_NAME];
33
+ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=jwt-payload-expiration-ratchet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-payload-expiration-ratchet.js","sourceRoot":"","sources":["../../src/jwt/jwt-payload-expiration-ratchet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,OAAO,2BAA2B;IAC9B,MAAM,CAAU,iBAAiB,GAAW,yBAAyB,CAAC;IAEvE,MAAM,CAAC,wBAAwB,CAAyB,OAAU,EAAE,eAAmC;QAC5G,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,UAAU,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAEzD,MAAM,UAAU,GAAW,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;YAC1H,MAAM,UAAU,GAAW,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;YAE1H,IAAI,CAAC,UAAU,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,IAAI,UAAU,CAAC,EAAE,CAAC;gBAEzF,MAAM,GAAG,GAAW,UAAU,GAAG,UAAU,CAAC;gBAC5C,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,gBAAgB,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;gBAC3H,QAAQ,eAAe,EAAE,CAAC;oBACxB;wBACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC3C;wBACE,OAAO,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;wBAC9D,MAAM;oBACR;wBACE,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,EAAO;QAClC,OAAO,EAAE,IAAI,EAAE,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1E,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,EAAO;QACrC,IAAI,EAAE,EAAE,CAAC;YAEP,OAAO,EAAE,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-common",
3
- "version": "4.0.429-alpha",
3
+ "version": "4.0.432-alpha",
4
4
  "description": "Common tools for general use",
5
5
  "type": "module",
6
6
  "files": [
@@ -49,15 +49,15 @@
49
49
  },
50
50
  "license": "Apache-2.0",
51
51
  "optionalDependencies": {
52
- "jsonwebtoken": "9.0.2",
52
+ "jwt-decode": "4.0.0",
53
53
  "ts-enum-util": "4.1.0"
54
54
  },
55
55
  "peerDependencies": {
56
- "jsonwebtoken": "^9.0.2",
56
+ "jwt-decode": "^4.0.0",
57
57
  "ts-enum-util": "^4.1.0"
58
58
  },
59
59
  "peerDependenciesMeta": {
60
- "jsonwebtoken": {
60
+ "jwt-decode": {
61
61
  "optional": true
62
62
  },
63
63
  "ts-enum-util": {
@@ -1,8 +0,0 @@
1
- import { LoggerLevelName } from '../logger/logger-level-name.js';
2
- export interface JwtRatchetConfig {
3
- encryptionKeyPromise: Promise<string | string[]>;
4
- decryptKeysPromise?: Promise<string[]>;
5
- jtiGenerator?: () => string;
6
- decryptOnlyKeyUseLogLevel?: LoggerLevelName;
7
- parseFailureLogLevel?: LoggerLevelName;
8
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=jwt-ratchet-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt-ratchet-config.js","sourceRoot":"","sources":["../../src/jwt/jwt-ratchet-config.ts"],"names":[],"mappings":""}
@@ -1,15 +0,0 @@
1
- import { JwtTokenBase } from './jwt-token-base.js';
2
- import { LoggerLevelName } from '../logger/logger-level-name.js';
3
- import { ExpiredJwtHandling } from './expired-jwt-handling.js';
4
- export interface JwtRatchetLike {
5
- get encryptionKeyPromise(): Promise<string | string[]>;
6
- get decryptKeysPromise(): Promise<string[]>;
7
- get jtiGenerator(): () => string;
8
- get decryptOnlyKeyUseLogLevel(): LoggerLevelName;
9
- get parseFailureLogLevel(): LoggerLevelName;
10
- decodeToken<T extends JwtTokenBase>(payloadString: string, expiredHandling?: ExpiredJwtHandling): Promise<T>;
11
- encryptionKeyArray(): Promise<string[]>;
12
- selectRandomEncryptionKey(): Promise<string>;
13
- createTokenString(payload: any, expirationSeconds?: number, overrideEncryptionKey?: string): Promise<string>;
14
- refreshJWTString(tokenString: string, allowExpired?: boolean, expirationSeconds?: number): Promise<string>;
15
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=jwt-ratchet-like.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt-ratchet-like.js","sourceRoot":"","sources":["../../src/jwt/jwt-ratchet-like.ts"],"names":[],"mappings":""}
@@ -1,28 +0,0 @@
1
- import { JwtTokenBase } from './jwt-token-base.js';
2
- import { LoggerLevelName } from '../logger/logger-level-name.js';
3
- import { ExpiredJwtHandling } from './expired-jwt-handling.js';
4
- import { JwtRatchetLike } from './jwt-ratchet-like.js';
5
- import { JwtRatchetConfig } from './jwt-ratchet-config.js';
6
- export declare class JwtRatchet implements JwtRatchetLike {
7
- private cfg;
8
- private static readonly EXPIRED_FLAG_NAME;
9
- constructor(cfg: JwtRatchetConfig);
10
- get copyConfig(): JwtRatchetConfig;
11
- get encryptionKeyPromise(): Promise<string | string[]>;
12
- get decryptKeysPromise(): Promise<string[]>;
13
- get jtiGenerator(): () => string;
14
- get decryptOnlyKeyUseLogLevel(): LoggerLevelName;
15
- get parseFailureLogLevel(): LoggerLevelName;
16
- static hasExpiredFlag(ob: any): boolean;
17
- static invalidSafeDecode<T>(payloadString: string, decryptKey: string, logLevel?: LoggerLevelName): Promise<T>;
18
- static secondsRemainingUntilExpiration(payloadString: string): Promise<number>;
19
- static msRemainingUntilExpiration(payloadString: string): Promise<number>;
20
- decodeToken<T extends JwtTokenBase>(payloadString: string, expiredHandling?: ExpiredJwtHandling): Promise<T>;
21
- encryptionKeyArray(): Promise<string[]>;
22
- selectRandomEncryptionKey(): Promise<string>;
23
- createTokenString(payload: any, expirationSeconds?: number, overrideEncryptionKey?: string): Promise<string>;
24
- refreshJWTString(tokenString: string, allowExpired?: boolean, expirationSeconds?: number): Promise<string>;
25
- static decodeTokenNoVerify<T extends JwtTokenBase>(token: string): Promise<T>;
26
- static removeJwtFields(ob: any): void;
27
- static removeExpiredFlag(ob: any): void;
28
- }
@@ -1,171 +0,0 @@
1
- import { RequireRatchet } from '../lang/require-ratchet.js';
2
- import { Logger } from '../logger/logger.js';
3
- import { StringRatchet } from '../lang/string-ratchet.js';
4
- import { DurationRatchet } from '../lang/duration-ratchet.js';
5
- import { LoggerLevelName } from '../logger/logger-level-name.js';
6
- import jsonwebtoken from 'jsonwebtoken';
7
- export class JwtRatchet {
8
- cfg;
9
- static EXPIRED_FLAG_NAME = '__jwtServiceExpiredFlag';
10
- constructor(cfg) {
11
- this.cfg = cfg;
12
- RequireRatchet.notNullOrUndefined(cfg, 'config');
13
- RequireRatchet.notNullOrUndefined(cfg.encryptionKeyPromise, 'encryptionKeyPromise');
14
- cfg.jtiGenerator = cfg.jtiGenerator ?? StringRatchet.createType4Guid;
15
- cfg.decryptOnlyKeyUseLogLevel = cfg.decryptOnlyKeyUseLogLevel ?? LoggerLevelName.info;
16
- cfg.parseFailureLogLevel = cfg.parseFailureLogLevel ?? LoggerLevelName.debug;
17
- }
18
- get copyConfig() {
19
- const rval = {
20
- encryptionKeyPromise: this.cfg.encryptionKeyPromise,
21
- decryptKeysPromise: this.cfg.decryptKeysPromise,
22
- jtiGenerator: this.cfg.jtiGenerator,
23
- decryptOnlyKeyUseLogLevel: this.cfg.decryptOnlyKeyUseLogLevel,
24
- parseFailureLogLevel: this.cfg.parseFailureLogLevel,
25
- };
26
- return rval;
27
- }
28
- get encryptionKeyPromise() {
29
- return this.cfg.encryptionKeyPromise;
30
- }
31
- get decryptKeysPromise() {
32
- return this.cfg.decryptKeysPromise;
33
- }
34
- get jtiGenerator() {
35
- return this.cfg.jtiGenerator;
36
- }
37
- get decryptOnlyKeyUseLogLevel() {
38
- return this.cfg.decryptOnlyKeyUseLogLevel;
39
- }
40
- get parseFailureLogLevel() {
41
- return this.cfg.parseFailureLogLevel;
42
- }
43
- static hasExpiredFlag(ob) {
44
- return ob && ob[JwtRatchet.EXPIRED_FLAG_NAME] === true;
45
- }
46
- static async invalidSafeDecode(payloadString, decryptKey, logLevel = LoggerLevelName.silly) {
47
- let rval = null;
48
- try {
49
- rval = jsonwebtoken.verify(payloadString, decryptKey, { ignoreExpiration: true });
50
- }
51
- catch (err) {
52
- Logger.logByLevel(logLevel, 'Caught %s - ignoring', err);
53
- }
54
- return rval;
55
- }
56
- static async secondsRemainingUntilExpiration(payloadString) {
57
- let rval = null;
58
- if (StringRatchet.trimToNull(payloadString)) {
59
- const output = await JwtRatchet.decodeTokenNoVerify(payloadString);
60
- const nowSecond = Math.floor(Date.now() / 1000);
61
- if (output.exp) {
62
- const expSeconds = output.exp > nowSecond * 100 ? Math.floor(output.exp / 1000) : output.exp;
63
- rval = Math.max(0, expSeconds - nowSecond);
64
- }
65
- }
66
- return rval;
67
- }
68
- static async msRemainingUntilExpiration(payloadString) {
69
- const secs = await JwtRatchet.secondsRemainingUntilExpiration(payloadString);
70
- let rval = null;
71
- if (secs !== null && secs !== undefined) {
72
- rval = secs * 1000;
73
- }
74
- return rval;
75
- }
76
- async decodeToken(payloadString, expiredHandling = 0) {
77
- const encKeys = await this.encryptionKeyArray();
78
- let decKeys = Object.assign([], encKeys);
79
- if (this.decryptKeysPromise) {
80
- decKeys = decKeys.concat(await this.decryptKeysPromise);
81
- }
82
- const keysTried = [];
83
- let payload = null;
84
- for (let i = 0; i < decKeys.length && !payload; i++) {
85
- keysTried.push(StringRatchet.obscure(decKeys[i], 1, 1));
86
- const logLevel = i === decKeys.length - 1 && this.parseFailureLogLevel ? this.parseFailureLogLevel : LoggerLevelName.silly;
87
- payload = await JwtRatchet.invalidSafeDecode(payloadString, decKeys[i], logLevel);
88
- if (payload && i >= encKeys.length) {
89
- Logger.logByLevel(this.decryptOnlyKeyUseLogLevel, 'Used old key to decode token : %s', StringRatchet.obscure(decKeys[i], 2));
90
- }
91
- }
92
- if (payload) {
93
- const nowSeconds = Math.floor(Date.now() / 1000);
94
- const expSeconds = payload?.exp && payload.exp > nowSeconds * 100 ? Math.floor(payload.exp / 1000) : payload?.exp;
95
- const nbfSeconds = payload?.nbf && payload.nbf > nowSeconds * 100 ? Math.floor(payload.nbf / 1000) : payload?.nbf;
96
- if ((expSeconds && nowSeconds >= expSeconds) || (nbfSeconds && nowSeconds <= nbfSeconds)) {
97
- const age = nowSeconds - expSeconds;
98
- Logger.debug('JWT token expired or before NBF : on %d, %s ago', payload.exp, DurationRatchet.formatMsDuration(age * 1000));
99
- switch (expiredHandling) {
100
- case 1:
101
- throw new Error('JWT Token was expired');
102
- case 2:
103
- payload[JwtRatchet.EXPIRED_FLAG_NAME] = true;
104
- break;
105
- default:
106
- payload = null;
107
- break;
108
- }
109
- }
110
- }
111
- else {
112
- Logger.warn('Unable to parse a payload (Tried %j) from : %s', keysTried, payloadString);
113
- }
114
- return payload;
115
- }
116
- async encryptionKeyArray() {
117
- const encKey = await this.encryptionKeyPromise;
118
- const rval = Array.isArray(encKey) ? encKey : [encKey];
119
- if (rval.length < 1) {
120
- throw new Error('Cannot create JwtRatchet with empty encryption key set');
121
- }
122
- return rval;
123
- }
124
- async selectRandomEncryptionKey() {
125
- const encKey = await this.encryptionKeyArray();
126
- const rval = encKey[Math.floor(Math.random() * encKey.length)];
127
- return rval;
128
- }
129
- async createTokenString(payload, expirationSeconds, overrideEncryptionKey) {
130
- const encKey = StringRatchet.trimToNull(overrideEncryptionKey)
131
- ? StringRatchet.trimToNull(overrideEncryptionKey)
132
- : await this.selectRandomEncryptionKey();
133
- RequireRatchet.notNullOrUndefined(payload, 'payload');
134
- payload.jti = this.jtiGenerator ? this.jtiGenerator() : null;
135
- if (expirationSeconds) {
136
- const nowSeconds = Math.floor(Date.now() / 1000);
137
- const expires = nowSeconds + expirationSeconds;
138
- Logger.debug('Forcing expiration to %d', expires);
139
- payload.exp = expires;
140
- }
141
- const token = jsonwebtoken.sign(payload, encKey);
142
- return token;
143
- }
144
- async refreshJWTString(tokenString, allowExpired, expirationSeconds) {
145
- const handling = allowExpired ? 2 : 1;
146
- const payload = await this.decodeToken(tokenString, handling);
147
- const originalDurationSeconds = payload.exp && payload.iat ? payload.exp - payload.iat : null;
148
- const newExpirationSeconds = expirationSeconds || originalDurationSeconds;
149
- JwtRatchet.removeJwtFields(payload);
150
- JwtRatchet.removeExpiredFlag(payload);
151
- const token = await this.createTokenString(payload, newExpirationSeconds);
152
- return token;
153
- }
154
- static async decodeTokenNoVerify(token) {
155
- const rval = jsonwebtoken.decode(token);
156
- return rval;
157
- }
158
- static removeJwtFields(ob) {
159
- if (ob) {
160
- ['iss', 'sub', 'aud', 'exp', 'nbf', 'iat', 'jti'].forEach((k) => {
161
- delete ob[k];
162
- });
163
- }
164
- }
165
- static removeExpiredFlag(ob) {
166
- if (ob) {
167
- delete ob[JwtRatchet.EXPIRED_FLAG_NAME];
168
- }
169
- }
170
- }
171
- //# sourceMappingURL=jwt-ratchet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt-ratchet.js","sourceRoot":"","sources":["../../src/jwt/jwt-ratchet.ts"],"names":[],"mappings":"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"}