vona-module-a-jwt 5.0.29 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +0 -0
  2. package/dist/.metadata/index.d.ts +1 -0
  3. package/dist/.metadata/index.d.ts.map +1 -0
  4. package/dist/.metadata/this.d.ts +1 -0
  5. package/dist/.metadata/this.d.ts.map +1 -0
  6. package/dist/bean/bean.jwt.d.ts +2 -1
  7. package/dist/bean/bean.jwt.d.ts.map +1 -0
  8. package/dist/config/config.d.ts +1 -0
  9. package/dist/config/config.d.ts.map +1 -0
  10. package/dist/dto/jwtToken.d.ts +1 -0
  11. package/dist/dto/jwtToken.d.ts.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +63 -63
  15. package/dist/index.js.map +1 -0
  16. package/dist/lib/authHeader.d.ts +1 -0
  17. package/dist/lib/authHeader.d.ts.map +1 -0
  18. package/dist/lib/checkErrorJwtExpired.d.ts +2 -0
  19. package/dist/lib/checkErrorJwtExpired.d.ts.map +1 -0
  20. package/dist/lib/const.d.ts +2 -0
  21. package/dist/lib/const.d.ts.map +1 -0
  22. package/dist/lib/index.d.ts +3 -0
  23. package/dist/lib/index.d.ts.map +1 -0
  24. package/dist/service/jwtClient.d.ts +4 -1
  25. package/dist/service/jwtClient.d.ts.map +1 -0
  26. package/dist/service/jwtExtract.d.ts +2 -1
  27. package/dist/service/jwtExtract.d.ts.map +1 -0
  28. package/dist/types/index.d.ts +1 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/jwt.d.ts +7 -1
  31. package/dist/types/jwt.d.ts.map +1 -0
  32. package/package.json +21 -16
  33. package/src/.metadata/index.ts +146 -0
  34. package/src/.metadata/this.ts +2 -0
  35. package/src/bean/bean.jwt.ts +52 -0
  36. package/src/config/config.ts +47 -0
  37. package/src/dto/jwtToken.ts +20 -0
  38. package/src/index.ts +3 -0
  39. package/src/lib/authHeader.ts +7 -0
  40. package/src/lib/checkErrorJwtExpired.ts +8 -0
  41. package/src/lib/const.ts +1 -0
  42. package/src/lib/index.ts +3 -0
  43. package/src/service/jwtClient.ts +109 -0
  44. package/src/service/jwtExtract.ts +37 -0
  45. package/src/types/index.ts +1 -0
  46. package/src/types/jwt.ts +66 -0
package/LICENSE CHANGED
File without changes
@@ -107,3 +107,4 @@ declare module 'vona' {
107
107
  }
108
108
  }
109
109
  /** scope: end */
110
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/.metadata/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export declare const __ThisModule__ = "a-jwt";
2
2
  export { ScopeModuleAJwt as ScopeModule } from './index.ts';
3
+ //# sourceMappingURL=this.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"this.d.ts","sourceRoot":"","sources":["../../src/.metadata/this.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { IAuthenticateStrategyState } from 'vona-module-a-auth';
2
- import type { IJwtClientRecord, IJwtSignOptions, IJwtToken, IPayloadData } from '../types/jwt.ts';
3
2
  import { BeanBase } from 'vona';
3
+ import type { IJwtClientRecord, IJwtSignOptions, IJwtToken, IPayloadData } from '../types/jwt.ts';
4
4
  import { ServiceJwtClient } from '../service/jwtClient.ts';
5
5
  export declare class BeanJwt extends BeanBase {
6
6
  get(clientName?: keyof IJwtClientRecord): ServiceJwtClient;
@@ -11,3 +11,4 @@ export declare class BeanJwt extends BeanBase {
11
11
  createOauthCode(payloadData: IPayloadData, options?: IJwtSignOptions): Promise<string>;
12
12
  extractAuthTokenFromAllWays(): string | undefined;
13
13
  }
14
+ //# sourceMappingURL=bean.jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bean.jwt.d.ts","sourceRoot":"","sources":["../../src/bean/bean.jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGrE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,qBACa,OAAQ,SAAQ,QAAQ;IACnC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,gBAAgB;IAIjC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAgBhF,mBAAmB,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAIxE,oBAAoB,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAIzE,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE,eAAe;IAInF,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAI1E,2BAA2B;CAG5B"}
@@ -1,3 +1,4 @@
1
1
  import type { VonaApplication, VonaConfigEnv } from 'vona';
2
2
  import type { ConfigJwt } from '../types/jwt.ts';
3
3
  export declare function config(_app: VonaApplication, env: VonaConfigEnv): ConfigJwt;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,GAyCzD,SAAS,CACf"}
@@ -7,3 +7,4 @@ export declare class DtoJwtToken implements IJwtToken {
7
7
  refreshToken: string;
8
8
  expiresIn: number;
9
9
  }
10
+ //# sourceMappingURL=jwtToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtToken.d.ts","sourceRoot":"","sources":["../../src/dto/jwtToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;CAAG;AAEpE,qBACa,WAAY,YAAW,SAAS;IAE3C,WAAW,EAAE,MAAM,CAAC;IAGpB,YAAY,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './.metadata/index.ts';
2
2
  export * from './lib/index.ts';
3
3
  export * from './types/index.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,14 +1,13 @@
1
1
  import { BeanInfo, BeanBase, deepExtend, cast, BeanScopeBase } from 'vona';
2
+ import { __decorate, __metadata } from 'tslib';
2
3
  import ms from 'ms';
3
4
  import { Service, Bean, Scope } from 'vona-module-a-bean';
5
+ import { catchError } from '@cabloy/utils';
4
6
  import jwt from 'jsonwebtoken';
5
7
  import { Api } from 'vona-module-a-openapiutils';
6
8
  import { Dto } from 'vona-module-a-web';
7
9
 
8
- var _dec$4, _dec2$4, _class$4;
9
- let ServiceJwtClient = (_dec$4 = Service(), _dec2$4 = BeanInfo({
10
- module: "a-jwt"
11
- }), _dec$4(_class$4 = _dec2$4(_class$4 = class ServiceJwtClient extends BeanBase {
10
+ let ServiceJwtClient = class ServiceJwtClient extends BeanBase {
12
11
  constructor(...args) {
13
12
  super(...args);
14
13
  this._jwtInstance = void 0;
@@ -43,6 +42,14 @@ let ServiceJwtClient = (_dec$4 = Service(), _dec2$4 = BeanInfo({
43
42
  return this.scope.config.field.payload.data;
44
43
  }
45
44
  async sign(payloadData, options) {
45
+ const [res, error] = await catchError(() => {
46
+ return this._signInner(payloadData, options);
47
+ });
48
+ this.$loggerChild('jwt').debug(() => `jwt.sign: client:${this._clientName}, token:${res}${error ? `, error: ${error.message}` : ''}`);
49
+ if (error) throw error;
50
+ return res;
51
+ }
52
+ async _signInner(payloadData, options) {
46
53
  return new Promise((resolve, reject) => {
47
54
  const payload = {
48
55
  [this.fieldClient]: this._clientName,
@@ -68,10 +75,20 @@ let ServiceJwtClient = (_dec$4 = Service(), _dec2$4 = BeanInfo({
68
75
  }
69
76
  async verify(token, options) {
70
77
  if (!token && this._clientName === 'access') token = this.scope.service.jwtExtract.fromAllWays();
78
+ const [res, error] = await catchError(() => {
79
+ return this._verifyInner(token, options);
80
+ });
81
+ this.$loggerChild('jwt').debug(() => `jwt.verify: client:${this._clientName}, token:${token}${error ? `, error: ${error.message}` : ''}`);
82
+ if (error) throw error;
83
+ return res;
84
+ }
85
+ async _verifyInner(token, options) {
71
86
  if (!token) return undefined;
72
87
  return new Promise((resolve, reject) => {
73
88
  this._jwtInstance.verify(token, this._clientOptions.secret, this._clientOptions.verifyOptions, (err, decoded) => {
74
- if (err) return reject(err);
89
+ if (err) {
90
+ return reject(err);
91
+ }
75
92
  const payload = cast(decoded);
76
93
  // check field client
77
94
  if (payload[this.fieldClient] !== this._clientName) return this.app.throw(401);
@@ -88,12 +105,12 @@ let ServiceJwtClient = (_dec$4 = Service(), _dec2$4 = BeanInfo({
88
105
  if (Array.isArray(pathTarget) && !pathTarget.includes(path)) return false;
89
106
  return pathTarget === path;
90
107
  }
91
- }) || _class$4) || _class$4);
92
-
93
- var _dec$3, _dec2$3, _class$3;
94
- let BeanJwt = (_dec$3 = Bean(), _dec2$3 = BeanInfo({
108
+ };
109
+ ServiceJwtClient = __decorate([Service(), BeanInfo({
95
110
  module: "a-jwt"
96
- }), _dec$3(_class$3 = _dec2$3(_class$3 = class BeanJwt extends BeanBase {
111
+ })], ServiceJwtClient);
112
+
113
+ let BeanJwt = class BeanJwt extends BeanBase {
97
114
  get(clientName) {
98
115
  return this.app.bean._getBeanSelector(ServiceJwtClient, clientName);
99
116
  }
@@ -129,7 +146,10 @@ let BeanJwt = (_dec$3 = Bean(), _dec2$3 = BeanInfo({
129
146
  extractAuthTokenFromAllWays() {
130
147
  return this.scope.service.jwtExtract.fromAllWays();
131
148
  }
132
- }) || _class$3) || _class$3);
149
+ };
150
+ BeanJwt = __decorate([Bean(), BeanInfo({
151
+ module: "a-jwt"
152
+ })], BeanJwt);
133
153
 
134
154
  const re = /(\S+)\s+(\S+)/;
135
155
  function parseAuthHeader(headerValue) {
@@ -141,10 +161,7 @@ function parseAuthHeader(headerValue) {
141
161
  };
142
162
  }
143
163
 
144
- var _dec$2, _dec2$2, _class$2;
145
- let ServiceJwtExtract = (_dec$2 = Service(), _dec2$2 = BeanInfo({
146
- module: "a-jwt"
147
- }), _dec$2(_class$2 = _dec2$2(_class$2 = class ServiceJwtExtract extends BeanBase {
164
+ let ServiceJwtExtract = class ServiceJwtExtract extends BeanBase {
148
165
  fromHeader() {
149
166
  if (!this.scope.config.field.extract.header) return;
150
167
  return this.ctx.request.headers[this.scope.config.field.extract.header];
@@ -152,8 +169,10 @@ let ServiceJwtExtract = (_dec$2 = Service(), _dec2$2 = BeanInfo({
152
169
  fromQuery() {
153
170
  return this.ctx.request.query[this.scope.config.field.extract.query];
154
171
  }
155
- fromAuthHeaderWithScheme() {
156
- const headerValue = this.ctx.request.headers[this.scope.config.field.extract.headerAuth];
172
+ fromAuthHeaderWithScheme(headerValue) {
173
+ if (!headerValue) {
174
+ headerValue = this.ctx.request.headers[this.scope.config.field.extract.headerAuth];
175
+ }
157
176
  const auth = parseAuthHeader(headerValue);
158
177
  if (!auth || auth.scheme.toLocaleLowerCase() !== this.scope.config.field.extract.headerAuthScheme.toLocaleLowerCase()) return;
159
178
  return auth.value;
@@ -168,50 +187,24 @@ let ServiceJwtExtract = (_dec$2 = Service(), _dec2$2 = BeanInfo({
168
187
  if (!token) token = this.fromCookie();
169
188
  return token;
170
189
  }
171
- }) || _class$2) || _class$2);
172
-
173
- function _applyDecoratedDescriptor(i, e, r, n, l) {
174
- var a = {};
175
- return Object.keys(n).forEach(function (i) {
176
- a[i] = n[i];
177
- }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = true), a = r.slice().reverse().reduce(function (r, n) {
178
- return n(i, e, r) || r;
179
- }, a), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a;
180
- }
181
- function _initializerDefineProperty(e, i, r, l) {
182
- r && Object.defineProperty(e, i, {
183
- enumerable: r.enumerable,
184
- configurable: r.configurable,
185
- writable: r.writable,
186
- value: r.initializer ? r.initializer.call(l) : void 0
187
- });
188
- }
189
-
190
- var _dec$1, _dec2$1, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _class$1, _class2, _descriptor, _descriptor2, _descriptor3;
191
- let DtoJwtToken = (_dec$1 = Dto(), _dec2$1 = BeanInfo({
190
+ };
191
+ ServiceJwtExtract = __decorate([Service(), BeanInfo({
192
192
  module: "a-jwt"
193
- }), _dec3 = Api.field(), _dec4 = Reflect.metadata("design:type", String), _dec5 = Api.field(), _dec6 = Reflect.metadata("design:type", String), _dec7 = Api.field(), _dec8 = Reflect.metadata("design:type", Number), _dec$1(_class$1 = _dec2$1(_class$1 = (_class2 = class DtoJwtToken {
193
+ })], ServiceJwtExtract);
194
+
195
+ let DtoJwtToken = class DtoJwtToken {
194
196
  constructor() {
195
- _initializerDefineProperty(this, "accessToken", _descriptor, this);
196
- _initializerDefineProperty(this, "refreshToken", _descriptor2, this);
197
- _initializerDefineProperty(this, "expiresIn", _descriptor3, this);
197
+ this.accessToken = void 0;
198
+ this.refreshToken = void 0;
199
+ this.expiresIn = void 0;
198
200
  }
199
- }, _descriptor = _applyDecoratedDescriptor(_class2.prototype, "accessToken", [_dec3, _dec4], {
200
- configurable: true,
201
- enumerable: true,
202
- writable: true,
203
- initializer: null
204
- }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "refreshToken", [_dec5, _dec6], {
205
- configurable: true,
206
- enumerable: true,
207
- writable: true,
208
- initializer: null
209
- }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "expiresIn", [_dec7, _dec8], {
210
- configurable: true,
211
- enumerable: true,
212
- writable: true,
213
- initializer: null
214
- }), _class2)) || _class$1) || _class$1);
201
+ };
202
+ __decorate([Api.field(), __metadata("design:type", String)], DtoJwtToken.prototype, "accessToken", void 0);
203
+ __decorate([Api.field(), __metadata("design:type", String)], DtoJwtToken.prototype, "refreshToken", void 0);
204
+ __decorate([Api.field(), __metadata("design:type", Number)], DtoJwtToken.prototype, "expiresIn", void 0);
205
+ DtoJwtToken = __decorate([Dto(), BeanInfo({
206
+ module: "a-jwt"
207
+ })], DtoJwtToken);
215
208
 
216
209
  function config(_app, env) {
217
210
  return {
@@ -273,13 +266,20 @@ function config(_app, env) {
273
266
  };
274
267
  }
275
268
 
276
- var _dec, _dec2, _class;
277
- let ScopeModuleAJwt = (_dec = Scope(), _dec2 = BeanInfo({
269
+ let ScopeModuleAJwt = class ScopeModuleAJwt extends BeanScopeBase {};
270
+ ScopeModuleAJwt = __decorate([Scope(), BeanInfo({
278
271
  module: "a-jwt"
279
- }), _dec(_class = _dec2(_class = class ScopeModuleAJwt extends BeanScopeBase {}) || _class) || _class);
280
-
272
+ })], ScopeModuleAJwt);
281
273
  /** scope: end */
282
274
 
283
275
  const ErrorMessageJwtExpired = 'jwt expired';
284
276
 
285
- export { BeanJwt, DtoJwtToken, ErrorMessageJwtExpired, ScopeModuleAJwt, ServiceJwtClient, ServiceJwtExtract, config, parseAuthHeader };
277
+ // throw error only when ErrorMessageJwtExpired
278
+ function checkErrorJwtExpired(err, headers) {
279
+ if (err && err.message === ErrorMessageJwtExpired && (headers['x-vona-jwt-authtoken'] === true || headers['x-vona-jwt-authtoken'] === 'true')) {
280
+ throw err;
281
+ }
282
+ }
283
+
284
+ export { BeanJwt, DtoJwtToken, ErrorMessageJwtExpired, ScopeModuleAJwt, ServiceJwtClient, ServiceJwtExtract, checkErrorJwtExpired, config, parseAuthHeader };
285
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/service/jwtClient.ts","../src/bean/bean.jwt.ts","../src/lib/authHeader.ts","../src/service/jwtExtract.ts","../src/dto/jwtToken.ts","../src/config/config.ts","../src/.metadata/index.ts","../src/lib/const.ts","../src/lib/checkErrorJwtExpired.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["ServiceJwtClient","BeanBase","constructor","args","_jwtInstance","_clientName","_clientOptions","instance","__init__","clientName","_createClient","configJwt","scope","config","configClient","clients","Error","secret","base","app","server","keys","deepExtend","jwt","fieldClient","field","payload","client","fieldPath","path","fieldData","data","sign","payloadData","options","res","error","catchError","_signInner","$loggerChild","debug","message","Promise","resolve","reject","signOptions","dev","Object","assign","expiresIn","refresh","temp","tempAuthToken","err","encoded","verify","token","service","jwtExtract","fromAllWays","_verifyInner","undefined","verifyOptions","decoded","cast","throw","_checkVerifyPath","pathTarget","pathReal","String","ctx","route","routePathRaw","Array","isArray","includes","__decorate","Service","__z_BeanInfo","module","BeanJwt","get","bean","_getBeanSelector","create","accessToken","refreshToken","access","Math","floor","ms","createTempAuthToken","createOauthAuthToken","createOauthState","createOauthCode","extractAuthTokenFromAllWays","Bean","re","parseAuthHeader","headerValue","matches","match","scheme","value","ServiceJwtExtract","fromHeader","extract","header","request","headers","fromQuery","query","fromAuthHeaderWithScheme","headerAuth","auth","toLocaleLowerCase","headerAuthScheme","fromCookie","cookies","cookie","DtoJwtToken","Api","prototype","Dto","_app","env","issuer","APP_NAME","oauth","oauthstate","code","ScopeModuleAJwt","BeanScopeBase","Scope","ErrorMessageJwtExpired","checkErrorJwtExpired"],"mappings":"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"}
@@ -2,3 +2,4 @@ export declare function parseAuthHeader(headerValue?: any): {
2
2
  scheme: string;
3
3
  value: string;
4
4
  } | null | undefined;
5
+ //# sourceMappingURL=authHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authHeader.d.ts","sourceRoot":"","sources":["../../src/lib/authHeader.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,GAAG;;;qBAIhD"}
@@ -0,0 +1,2 @@
1
+ export declare function checkErrorJwtExpired(err: Error | undefined, headers: any): void;
2
+ //# sourceMappingURL=checkErrorJwtExpired.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkErrorJwtExpired.d.ts","sourceRoot":"","sources":["../../src/lib/checkErrorJwtExpired.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,GAAG,QAIxE"}
@@ -0,0 +1,2 @@
1
+ export declare const ErrorMessageJwtExpired = "jwt expired";
2
+ //# sourceMappingURL=const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/lib/const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,gBAAgB,CAAC"}
@@ -1 +1,4 @@
1
1
  export * from './authHeader.ts';
2
+ export * from './checkErrorJwtExpired.ts';
3
+ export * from './const.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { IJwtClientRecord, IJwtSignOptions, IJwtVerifyOptions, IPayloadData } from '../types/jwt.ts';
2
1
  import jwt from 'jsonwebtoken';
3
2
  import { BeanBase } from 'vona';
3
+ import type { IJwtClientRecord, IJwtSignOptions, IJwtVerifyOptions, IPayloadData } from '../types/jwt.ts';
4
4
  export declare class ServiceJwtClient extends BeanBase {
5
5
  private _jwtInstance;
6
6
  private _clientName;
@@ -12,6 +12,9 @@ export declare class ServiceJwtClient extends BeanBase {
12
12
  private get fieldPath();
13
13
  private get fieldData();
14
14
  sign(payloadData: IPayloadData, options?: IJwtSignOptions): Promise<string>;
15
+ private _signInner;
15
16
  verify(token?: string, options?: IJwtVerifyOptions): Promise<IPayloadData | undefined>;
17
+ private _verifyInner;
16
18
  _checkVerifyPath(pathTarget: string | string[] | undefined, pathReal: string | undefined): boolean;
17
19
  }
20
+ //# sourceMappingURL=jwtClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtClient.d.ts","sourceRoot":"","sources":["../../src/service/jwtClient.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAoB,MAAM,MAAM,CAAC;AAGlD,OAAO,KAAK,EAAqB,gBAAgB,EAAe,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1I,qBACa,gBAAiB,SAAQ,QAAQ;IAC5C,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,cAAc,CAAoB;IAE1C,IAAI,QAAQ,IAAI,OAAO,GAAG,CAEzB;IAED,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,gBAAgB;IAItD,OAAO,CAAC,aAAa;IAWrB,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAEK,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;YASnE,UAAU;IAqBlB,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;YAU9E,YAAY;IAkB1B,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;CAMzF"}
@@ -2,7 +2,8 @@ import { BeanBase } from 'vona';
2
2
  export declare class ServiceJwtExtract extends BeanBase {
3
3
  fromHeader(): string | undefined;
4
4
  fromQuery(): string;
5
- fromAuthHeaderWithScheme(): string | undefined;
5
+ fromAuthHeaderWithScheme(headerValue?: string): string | undefined;
6
6
  fromCookie(): string | undefined;
7
7
  fromAllWays(): string | undefined;
8
8
  }
9
+ //# sourceMappingURL=jwtExtract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtExtract.d.ts","sourceRoot":"","sources":["../../src/service/jwtExtract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKhC,qBACa,iBAAkB,SAAQ,QAAQ;IAC7C,UAAU,IAAI,MAAM,GAAG,SAAS;IAKhC,SAAS;IAIT,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM;IAS7C,UAAU;IAIV,WAAW;CAOZ"}
@@ -1 +1,2 @@
1
1
  export * from './jwt.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { SignOptions, VerifyOptions } from 'jsonwebtoken';
2
2
  import type { StringValue } from 'ms';
3
- export declare const ErrorMessageJwtExpired = "jwt expired";
3
+ import 'vona';
4
4
  export interface IJwtToken {
5
5
  accessToken: string;
6
6
  refreshToken: string;
@@ -53,3 +53,9 @@ export interface IPayloadData {
53
53
  }
54
54
  export interface IJwtPayload {
55
55
  }
56
+ declare module 'vona' {
57
+ interface ILoggerChildRecord {
58
+ jwt: never;
59
+ }
60
+ }
61
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/types/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAEtC,OAAO,MAAM,CAAC;AAEd,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE;QACL,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,UAAU,EAAE,MAAM,CAAC;YACnB,gBAAgB,EAAE,MAAM,CAAC;YACzB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,aAAa,EAAE;QACb,WAAW,EAAE;YAAE,SAAS,EAAE,WAAW,GAAG,MAAM,CAAA;SAAE,CAAC;KAClD,CAAC;IACF,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,YAAY;CAAG;AAEhC,MAAM,WAAW,WAAW;CAAG;AAE/B,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAiB,kBAAkB;QACjC,GAAG,EAAE,KAAK,CAAC;KACZ;CACF"}
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "vona-module-a-jwt",
3
- "type": "module",
4
- "version": "5.0.29",
5
- "title": "a-jwt",
6
- "vonaModule": {
7
- "dependencies": {}
8
- },
3
+ "version": "5.1.1",
9
4
  "description": "",
10
- "author": "",
11
5
  "keywords": [
12
6
  "Vona Module"
13
7
  ],
8
+ "author": "",
9
+ "files": [
10
+ "assets",
11
+ "dist",
12
+ "src"
13
+ ],
14
+ "type": "module",
14
15
  "exports": {
15
16
  ".": {
16
17
  "types": [
@@ -21,10 +22,13 @@
21
22
  },
22
23
  "./package.json": "./package.json"
23
24
  },
24
- "files": [
25
- "assets",
26
- "dist"
27
- ],
25
+ "scripts": {
26
+ "clean": "rimraf dist tsconfig.build.tsbuildinfo",
27
+ "tsc:publish": "npm run clean && vona :bin:buildModule --sourcemap && tsc -p tsconfig.build.json",
28
+ "prepublishOnly": "npm run tsc:publish",
29
+ "prepack": "clean-package",
30
+ "postpack": "clean-package restore && npm run clean"
31
+ },
28
32
  "dependencies": {
29
33
  "@types/jsonwebtoken": "^9.0.10",
30
34
  "@types/ms": "^2.1.0",
@@ -35,8 +39,9 @@
35
39
  "clean-package": "^2.2.0",
36
40
  "rimraf": "^6.0.1"
37
41
  },
38
- "scripts": {
39
- "clean": "rimraf dist tsconfig.build.tsbuildinfo",
40
- "tsc:publish": "npm run clean && vona :bin:buildModule && tsc -p tsconfig.build.json"
41
- }
42
- }
42
+ "title": "a-jwt",
43
+ "vonaModule": {
44
+ "dependencies": {}
45
+ },
46
+ "gitHead": "991189da4443b789fcf77872990b901ccf43bccb"
47
+ }
@@ -0,0 +1,146 @@
1
+ // eslint-disable
2
+ import type { TypeSymbolKeyFieldsMore } from 'vona-module-a-orm';
3
+ import type { TypeEntityOptionsFields } from 'vona-module-a-openapi';
4
+ /** bean: begin */
5
+ export * from '../bean/bean.jwt.ts';
6
+
7
+ import 'vona';
8
+ declare module 'vona' {
9
+
10
+
11
+ }
12
+ declare module 'vona-module-a-jwt' {
13
+
14
+ export interface BeanJwt {
15
+ /** @internal */
16
+ get scope(): ScopeModuleAJwt;
17
+ }
18
+ }
19
+ /** bean: end */
20
+ /** bean: begin */
21
+ import type { BeanJwt } from '../bean/bean.jwt.ts';
22
+ import 'vona';
23
+ declare module 'vona' {
24
+ export interface IBeanRecordGlobal {
25
+ 'jwt': BeanJwt;
26
+ }
27
+ }
28
+ /** bean: end */
29
+ /** service: begin */
30
+ export * from '../service/jwtClient.ts';
31
+ export * from '../service/jwtExtract.ts';
32
+
33
+ import 'vona-module-a-bean';
34
+ declare module 'vona-module-a-bean' {
35
+
36
+ export interface IServiceRecord {
37
+ 'a-jwt:jwtClient': never;
38
+ 'a-jwt:jwtExtract': never;
39
+ }
40
+
41
+
42
+ }
43
+ declare module 'vona-module-a-jwt' {
44
+
45
+ export interface ServiceJwtClient {
46
+ /** @internal */
47
+ get scope(): ScopeModuleAJwt;
48
+ }
49
+
50
+ export interface ServiceJwtClient {
51
+ get $beanFullName(): 'a-jwt.service.jwtClient';
52
+ get $onionName(): 'a-jwt:jwtClient';
53
+
54
+ }
55
+
56
+ export interface ServiceJwtExtract {
57
+ /** @internal */
58
+ get scope(): ScopeModuleAJwt;
59
+ }
60
+
61
+ export interface ServiceJwtExtract {
62
+ get $beanFullName(): 'a-jwt.service.jwtExtract';
63
+ get $onionName(): 'a-jwt:jwtExtract';
64
+
65
+ }
66
+ }
67
+ /** service: end */
68
+ /** service: begin */
69
+ import type { ServiceJwtClient } from '../service/jwtClient.ts';
70
+ import type { ServiceJwtExtract } from '../service/jwtExtract.ts';
71
+ export interface IModuleService {
72
+ 'jwtClient': ServiceJwtClient;
73
+ 'jwtExtract': ServiceJwtExtract;
74
+ }
75
+ /** service: end */
76
+ /** service: begin */
77
+
78
+ import 'vona';
79
+ declare module 'vona' {
80
+ export interface IBeanRecordGeneral {
81
+ 'a-jwt.service.jwtClient': ServiceJwtClient;
82
+ 'a-jwt.service.jwtExtract': ServiceJwtExtract;
83
+ }
84
+ }
85
+ /** service: end */
86
+ /** dto: begin */
87
+ export * from '../dto/jwtToken.ts';
88
+ import type { IDtoOptionsJwtToken } from '../dto/jwtToken.ts';
89
+ import 'vona-module-a-web';
90
+ declare module 'vona-module-a-web' {
91
+
92
+ export interface IDtoRecord {
93
+ 'a-jwt:jwtToken': IDtoOptionsJwtToken;
94
+ }
95
+
96
+
97
+ }
98
+ declare module 'vona-module-a-jwt' {
99
+
100
+ }
101
+ /** dto: end */
102
+ /** dto: begin */
103
+ import type { DtoJwtToken } from '../dto/jwtToken.ts';
104
+ declare module 'vona-module-a-jwt' {
105
+
106
+ export interface IDtoOptionsJwtToken {
107
+ fields?: TypeEntityOptionsFields<DtoJwtToken, IDtoOptionsJwtToken[TypeSymbolKeyFieldsMore]>;
108
+ }
109
+ }
110
+ /** dto: end */
111
+ /** config: begin */
112
+ export * from '../config/config.ts';
113
+ import type { config } from '../config/config.ts';
114
+ /** config: end */
115
+ /** scope: begin */
116
+ import { BeanScopeBase, type BeanScopeUtil, type TypeModuleConfig } from 'vona';
117
+ import { Scope } from 'vona-module-a-bean';
118
+
119
+ @Scope()
120
+ export class ScopeModuleAJwt extends BeanScopeBase {}
121
+
122
+ export interface ScopeModuleAJwt {
123
+ util: BeanScopeUtil;
124
+ config: TypeModuleConfig<typeof config>;
125
+ service: IModuleService;
126
+ }
127
+
128
+ import 'vona';
129
+ declare module 'vona' {
130
+ export interface IBeanScopeRecord {
131
+ 'a-jwt': ScopeModuleAJwt;
132
+ }
133
+
134
+ export interface IBeanScopeContainer {
135
+ jwt: ScopeModuleAJwt;
136
+ }
137
+
138
+ export interface IBeanScopeConfig {
139
+ 'a-jwt': ReturnType<typeof config>;
140
+ }
141
+
142
+
143
+
144
+
145
+ }
146
+ /** scope: end */
@@ -0,0 +1,2 @@
1
+ export const __ThisModule__ = 'a-jwt';
2
+ export { ScopeModuleAJwt as ScopeModule } from './index.ts';
@@ -0,0 +1,52 @@
1
+ import type { IAuthenticateStrategyState } from 'vona-module-a-auth';
2
+
3
+ import ms from 'ms';
4
+ import { BeanBase } from 'vona';
5
+ import { Bean } from 'vona-module-a-bean';
6
+
7
+ import type { IJwtClientRecord, IJwtSignOptions, IJwtToken, IPayloadData } from '../types/jwt.ts';
8
+
9
+ import { ServiceJwtClient } from '../service/jwtClient.ts';
10
+
11
+ @Bean()
12
+ export class BeanJwt extends BeanBase {
13
+ get(clientName?: keyof IJwtClientRecord) {
14
+ return this.app.bean._getBeanSelector(ServiceJwtClient, clientName);
15
+ }
16
+
17
+ async create(payloadData: IPayloadData, options?: IJwtSignOptions): Promise<IJwtToken> {
18
+ // accessToken
19
+ const accessToken = await this.get('access').sign(payloadData, options);
20
+ // refreshToken
21
+ const refreshToken = await this.get('refresh').sign(payloadData, options);
22
+ // expiresIn
23
+ let expiresIn = this.scope.config.clients.access.signOptions.expiresIn!;
24
+ if (typeof expiresIn === 'string') expiresIn = Math.floor(ms(expiresIn) / 1000);
25
+ // ok
26
+ return {
27
+ accessToken,
28
+ refreshToken,
29
+ expiresIn,
30
+ };
31
+ }
32
+
33
+ async createTempAuthToken(payloadData: IPayloadData, options?: IJwtSignOptions) {
34
+ return await this.get('access').sign(payloadData, Object.assign({}, options, { temp: true }));
35
+ }
36
+
37
+ async createOauthAuthToken(payloadData: IPayloadData, options?: IJwtSignOptions) {
38
+ return await this.get('oauth').sign(payloadData, options);
39
+ }
40
+
41
+ async createOauthState(payloadData: IAuthenticateStrategyState, options?: IJwtSignOptions) {
42
+ return await this.get('oauthstate').sign(payloadData as IPayloadData, options);
43
+ }
44
+
45
+ async createOauthCode(payloadData: IPayloadData, options?: IJwtSignOptions) {
46
+ return await this.get('code').sign(payloadData, options);
47
+ }
48
+
49
+ extractAuthTokenFromAllWays() {
50
+ return this.scope.service.jwtExtract.fromAllWays();
51
+ }
52
+ }
@@ -0,0 +1,47 @@
1
+ import type { VonaApplication, VonaConfigEnv } from 'vona';
2
+
3
+ import type { ConfigJwt } from '../types/jwt.ts';
4
+
5
+ export function config(_app: VonaApplication, env: VonaConfigEnv) {
6
+ return {
7
+ field: {
8
+ payload: {
9
+ client: 'client',
10
+ path: 'path',
11
+ data: 'data',
12
+ },
13
+ extract: {
14
+ header: '',
15
+ headerAuth: 'authorization',
16
+ headerAuthScheme: 'bearer',
17
+ query: 'auth_token',
18
+ cookie: 'token',
19
+ },
20
+ },
21
+ tempAuthToken: {
22
+ signOptions: { expiresIn: 10 * 60 },
23
+ },
24
+ base: {
25
+ secret: undefined,
26
+ signOptions: { issuer: env.APP_NAME },
27
+ verifyOptions: { issuer: env.APP_NAME },
28
+ },
29
+ clients: {
30
+ access: {
31
+ signOptions: { expiresIn: 2 * 60 * 60 },
32
+ },
33
+ refresh: {
34
+ signOptions: { expiresIn: 7 * 24 * 60 * 60 },
35
+ },
36
+ oauth: {
37
+ signOptions: { expiresIn: 5 * 60 },
38
+ },
39
+ oauthstate: {
40
+ signOptions: { expiresIn: 5 * 60 },
41
+ },
42
+ code: {
43
+ signOptions: { expiresIn: 3 * 60 },
44
+ },
45
+ },
46
+ } as ConfigJwt;
47
+ }
@@ -0,0 +1,20 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { Api } from 'vona-module-a-openapiutils';
4
+ import { Dto } from 'vona-module-a-web';
5
+
6
+ import type { IJwtToken } from '../types/jwt.ts';
7
+
8
+ export interface IDtoOptionsJwtToken extends IDecoratorDtoOptions {}
9
+
10
+ @Dto<IDtoOptionsJwtToken>()
11
+ export class DtoJwtToken implements IJwtToken {
12
+ @Api.field()
13
+ accessToken: string;
14
+
15
+ @Api.field()
16
+ refreshToken: string;
17
+
18
+ @Api.field()
19
+ expiresIn: number;
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './.metadata/index.ts';
2
+ export * from './lib/index.ts';
3
+ export * from './types/index.ts';
@@ -0,0 +1,7 @@
1
+ const re = /(\S+)\s+(\S+)/;
2
+
3
+ export function parseAuthHeader(headerValue?: any) {
4
+ if (typeof headerValue !== 'string') return;
5
+ const matches = headerValue.match(re);
6
+ return matches && { scheme: matches[1], value: matches[2] };
7
+ }
@@ -0,0 +1,8 @@
1
+ import { ErrorMessageJwtExpired } from './const.ts';
2
+
3
+ // throw error only when ErrorMessageJwtExpired
4
+ export function checkErrorJwtExpired(err: Error | undefined, headers: any) {
5
+ if (err && err.message === ErrorMessageJwtExpired && (headers['x-vona-jwt-authtoken'] === true || headers['x-vona-jwt-authtoken'] === 'true')) {
6
+ throw err;
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ export const ErrorMessageJwtExpired = 'jwt expired';
@@ -0,0 +1,3 @@
1
+ export * from './authHeader.ts';
2
+ export * from './checkErrorJwtExpired.ts';
3
+ export * from './const.ts';
@@ -0,0 +1,109 @@
1
+ import { catchError } from '@cabloy/utils';
2
+ import jwt from 'jsonwebtoken';
3
+ import { BeanBase, cast, deepExtend } from 'vona';
4
+ import { Service } from 'vona-module-a-bean';
5
+
6
+ import type { IJwtClientOptions, IJwtClientRecord, IJwtPayload, IJwtSignOptions, IJwtVerifyOptions, IPayloadData } from '../types/jwt.ts';
7
+
8
+ @Service()
9
+ export class ServiceJwtClient extends BeanBase {
10
+ private _jwtInstance: typeof jwt;
11
+ private _clientName: keyof IJwtClientRecord;
12
+ private _clientOptions: IJwtClientOptions;
13
+
14
+ get instance(): typeof jwt {
15
+ return this._jwtInstance;
16
+ }
17
+
18
+ protected __init__(clientName?: keyof IJwtClientRecord) {
19
+ this._createClient(clientName);
20
+ }
21
+
22
+ private _createClient(clientName?: keyof IJwtClientRecord) {
23
+ clientName = clientName || 'access';
24
+ const configJwt = this.scope.config;
25
+ const configClient = configJwt.clients[clientName];
26
+ if (!configClient) throw new Error(`jwt client not found: ${clientName}`);
27
+ const secret = configJwt.base.secret ?? this.app.config.server.keys[0];
28
+ this._clientOptions = deepExtend({}, configJwt.base, { secret }, configClient);
29
+ this._clientName = clientName;
30
+ this._jwtInstance = jwt;
31
+ }
32
+
33
+ private get fieldClient() {
34
+ return this.scope.config.field.payload.client;
35
+ }
36
+
37
+ private get fieldPath() {
38
+ return this.scope.config.field.payload.path;
39
+ }
40
+
41
+ private get fieldData() {
42
+ return this.scope.config.field.payload.data;
43
+ }
44
+
45
+ async sign(payloadData: IPayloadData, options?: IJwtSignOptions): Promise<string> {
46
+ const [res, error] = await catchError(() => {
47
+ return this._signInner(payloadData, options);
48
+ });
49
+ this.$loggerChild('jwt').debug(() => `jwt.sign: client:${this._clientName}, token:${res}${error ? `, error: ${error.message}` : ''}`);
50
+ if (error) throw error;
51
+ return res;
52
+ }
53
+
54
+ private async _signInner(payloadData: IPayloadData, options?: IJwtSignOptions): Promise<string> {
55
+ return new Promise((resolve, reject) => {
56
+ const payload: IJwtPayload = {
57
+ [this.fieldClient]: this._clientName,
58
+ [this.fieldData]: payloadData,
59
+ };
60
+ if (options?.path) payload[this.fieldPath] = options.path;
61
+ let signOptions = this._clientOptions.signOptions;
62
+ if (options?.dev) {
63
+ signOptions = Object.assign({}, signOptions, { expiresIn: this.scope.config.clients.refresh.signOptions.expiresIn });
64
+ }
65
+ if (options?.temp) {
66
+ signOptions = Object.assign({}, signOptions, { expiresIn: this.scope.config.tempAuthToken.signOptions.expiresIn });
67
+ }
68
+ this._jwtInstance.sign(payload, this._clientOptions.secret!, signOptions, (err, encoded) => {
69
+ if (err) return reject(err);
70
+ resolve(encoded!);
71
+ });
72
+ });
73
+ }
74
+
75
+ async verify(token?: string, options?: IJwtVerifyOptions): Promise<IPayloadData | undefined> {
76
+ if (!token && this._clientName === 'access') token = this.scope.service.jwtExtract.fromAllWays();
77
+ const [res, error] = await catchError(() => {
78
+ return this._verifyInner(token, options);
79
+ });
80
+ this.$loggerChild('jwt').debug(() => `jwt.verify: client:${this._clientName}, token:${token}${error ? `, error: ${error.message}` : ''}`);
81
+ if (error) throw error;
82
+ return res;
83
+ }
84
+
85
+ private async _verifyInner(token?: string, options?: IJwtVerifyOptions): Promise<IPayloadData | undefined> {
86
+ if (!token) return undefined;
87
+ return new Promise((resolve, reject) => {
88
+ this._jwtInstance.verify(token, this._clientOptions.secret!, this._clientOptions.verifyOptions, (err, decoded) => {
89
+ if (err) {
90
+ return reject(err);
91
+ }
92
+ const payload = cast<IJwtPayload>(decoded);
93
+ // check field client
94
+ if (payload[this.fieldClient] !== this._clientName) return this.app.throw(401);
95
+ // check field path
96
+ if (!this._checkVerifyPath(payload[this.fieldPath], options?.path)) return this.app.throw(401);
97
+ // passed
98
+ resolve(payload[this.fieldData]);
99
+ });
100
+ });
101
+ }
102
+
103
+ _checkVerifyPath(pathTarget: string | string[] | undefined, pathReal: string | undefined) {
104
+ if (!pathTarget) return true;
105
+ const path = pathReal ?? String(this.ctx.route.routePathRaw);
106
+ if (Array.isArray(pathTarget) && !pathTarget.includes(path)) return false;
107
+ return pathTarget === path;
108
+ }
109
+ }
@@ -0,0 +1,37 @@
1
+ import { BeanBase } from 'vona';
2
+ import { Service } from 'vona-module-a-bean';
3
+
4
+ import { parseAuthHeader } from '../lib/authHeader.ts';
5
+
6
+ @Service()
7
+ export class ServiceJwtExtract extends BeanBase {
8
+ fromHeader(): string | undefined {
9
+ if (!this.scope.config.field.extract.header) return;
10
+ return this.ctx.request.headers[this.scope.config.field.extract.header] as string | undefined;
11
+ }
12
+
13
+ fromQuery() {
14
+ return this.ctx.request.query[this.scope.config.field.extract.query];
15
+ }
16
+
17
+ fromAuthHeaderWithScheme(headerValue?: string) {
18
+ if (!headerValue) {
19
+ headerValue = this.ctx.request.headers[this.scope.config.field.extract.headerAuth] as string | undefined;
20
+ }
21
+ const auth = parseAuthHeader(headerValue);
22
+ if (!auth || auth.scheme.toLocaleLowerCase() !== this.scope.config.field.extract.headerAuthScheme.toLocaleLowerCase()) return;
23
+ return auth.value;
24
+ }
25
+
26
+ fromCookie() {
27
+ return this.ctx.cookies.get(this.scope.config.field.extract.cookie);
28
+ }
29
+
30
+ fromAllWays() {
31
+ let token: string | undefined = this.fromQuery();
32
+ if (!token) token = this.fromAuthHeaderWithScheme();
33
+ if (!token) token = this.fromHeader();
34
+ if (!token) token = this.fromCookie();
35
+ return token;
36
+ }
37
+ }
@@ -0,0 +1 @@
1
+ export * from './jwt.ts';
@@ -0,0 +1,66 @@
1
+ import type { SignOptions, VerifyOptions } from 'jsonwebtoken';
2
+ import type { StringValue } from 'ms';
3
+
4
+ import 'vona';
5
+
6
+ export interface IJwtToken {
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ expiresIn: number;
10
+ }
11
+
12
+ export interface IJwtClientRecord {
13
+ access: never;
14
+ refresh: never;
15
+ oauth: never;
16
+ oauthstate: never;
17
+ code: never;
18
+ }
19
+
20
+ export interface IJwtSignOptions {
21
+ path?: string | string[];
22
+ dev?: boolean;
23
+ temp?: boolean;
24
+ }
25
+
26
+ export interface IJwtVerifyOptions {
27
+ path?: string;
28
+ }
29
+
30
+ export interface IJwtClientOptions {
31
+ secret?: string;
32
+ signOptions: SignOptions;
33
+ verifyOptions?: VerifyOptions;
34
+ }
35
+
36
+ export interface ConfigJwt {
37
+ field: {
38
+ payload: {
39
+ client: string;
40
+ path: string;
41
+ data: string;
42
+ };
43
+ extract: {
44
+ header: string;
45
+ headerAuth: string;
46
+ headerAuthScheme: string;
47
+ query: string;
48
+ cookie: string;
49
+ };
50
+ };
51
+ tempAuthToken: {
52
+ signOptions: { expiresIn: StringValue | number };
53
+ };
54
+ base: IJwtClientOptions;
55
+ clients: Record<keyof IJwtClientRecord, IJwtClientOptions>;
56
+ }
57
+
58
+ export interface IPayloadData {}
59
+
60
+ export interface IJwtPayload {}
61
+
62
+ declare module 'vona' {
63
+ export interface ILoggerChildRecord {
64
+ jwt: never;
65
+ }
66
+ }