@zola_do/authorization 0.2.15 → 0.2.16

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 (38) hide show
  1. package/README.md +16 -0
  2. package/dist/authorization.module.d.ts +3 -1
  3. package/dist/authorization.module.js +8 -1
  4. package/dist/authorization.module.js.map +1 -1
  5. package/dist/guards/api-key.guard.d.ts +1 -0
  6. package/dist/guards/api-key.guard.js +13 -4
  7. package/dist/guards/api-key.guard.js.map +1 -1
  8. package/dist/guards/jwt.guard.d.ts +3 -1
  9. package/dist/guards/jwt.guard.js +6 -4
  10. package/dist/guards/jwt.guard.js.map +1 -1
  11. package/dist/guards/optional-jwt.guard.js +1 -4
  12. package/dist/guards/optional-jwt.guard.js.map +1 -1
  13. package/dist/guards/permissions.guard.js +1 -1
  14. package/dist/guards/permissions.guard.js.map +1 -1
  15. package/dist/guards/throttler-behind-proxy.guard.js +2 -2
  16. package/dist/guards/throttler-behind-proxy.guard.js.map +1 -1
  17. package/dist/guards/webhook-signature.guard.d.ts +7 -0
  18. package/dist/guards/webhook-signature.guard.js +54 -0
  19. package/dist/guards/webhook-signature.guard.js.map +1 -0
  20. package/dist/helper/auth.helper.js +10 -9
  21. package/dist/helper/auth.helper.js.map +1 -1
  22. package/dist/helper/get-client-ip.helper.d.ts +12 -0
  23. package/dist/helper/get-client-ip.helper.js +26 -0
  24. package/dist/helper/get-client-ip.helper.js.map +1 -0
  25. package/dist/helper/jwt-options.helper.d.ts +17 -0
  26. package/dist/helper/jwt-options.helper.js +27 -0
  27. package/dist/helper/jwt-options.helper.js.map +1 -0
  28. package/dist/helper/validate-jwt-env.helper.d.ts +4 -0
  29. package/dist/helper/validate-jwt-env.helper.js +16 -0
  30. package/dist/helper/validate-jwt-env.helper.js.map +1 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/strategy/jwt-refresh-token.strategy.js +17 -3
  35. package/dist/strategy/jwt-refresh-token.strategy.js.map +1 -1
  36. package/dist/strategy/jwt.strategy.js +17 -3
  37. package/dist/strategy/jwt.strategy.js.map +1 -1
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -155,6 +155,8 @@ export class ProfileController {
155
155
 
156
156
  ## Guards
157
157
 
158
+ > **Reference:** See [GUARDS.md](./GUARDS.md) for guard ordering, optional throttler subpath, JWT algorithm pinning, and CSRF notes.
159
+
158
160
  ### JwtGuard
159
161
 
160
162
  Default global guard that validates Bearer tokens:
@@ -433,8 +435,22 @@ import { JwtRefreshTokenStrategy } from '@zola_do/authorization';
433
435
  | `JWT_ACCESS_TOKEN_EXPIRES` | Access token TTL | `15m` |
434
436
  | `JWT_REFRESH_TOKEN_SECRET` | Refresh token signing secret | Required |
435
437
  | `JWT_REFRESH_TOKEN_EXPIRES` | Refresh token TTL | `7d` |
438
+ | `JWT_ALGORITHM` | HMAC signing algorithm (`HS256`, `HS384`, `HS512`) | `HS256` |
436
439
  | `API_KEY` | API key for ApiKeyGuard | Optional |
437
440
 
441
+ `AuthorizationModule` calls `validateJwtEnv()` on startup. Import `validateJwtEnv` for explicit checks before bootstrap, or pass `{ required: false }` to skip when JWT is intentionally disabled.
442
+
443
+ ### Client IP behind a reverse proxy
444
+
445
+ ```typescript
446
+ import { getClientIp } from '@zola_do/authorization';
447
+
448
+ app.getHttpAdapter().getInstance().set('trust proxy', 1);
449
+ const ip = getClientIp(req);
450
+ ```
451
+
452
+ Used by `ThrottlerBehindProxyGuard`, `@zola_do/crud` `GlobalExceptionFilter`, and `@zola_do/audit` logging.
453
+
438
454
  ### Token Expiration Format
439
455
 
440
456
  ```
@@ -1,2 +1,4 @@
1
- export declare class AuthorizationModule {
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ export declare class AuthorizationModule implements OnModuleInit {
3
+ onModuleInit(): void;
2
4
  }
@@ -8,9 +8,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.AuthorizationModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
+ const validate_jwt_env_helper_1 = require("./helper/validate-jwt-env.helper");
11
12
  const jwt_1 = require("@nestjs/jwt");
12
13
  const passport_1 = require("@nestjs/passport");
13
14
  const auth_helper_1 = require("./helper/auth.helper");
15
+ const jwt_options_helper_1 = require("./helper/jwt-options.helper");
14
16
  const jwt_strategy_1 = require("./strategy/jwt.strategy");
15
17
  const jwt_refresh_token_strategy_1 = require("./strategy/jwt-refresh-token.strategy");
16
18
  const jwt_refresh_guard_1 = require("./guards/jwt-refresh.guard");
@@ -19,6 +21,9 @@ const core_1 = require("@nestjs/core");
19
21
  const api_key_guard_1 = require("./guards/api-key.guard");
20
22
  const optional_jwt_guard_1 = require("./guards/optional-jwt.guard");
21
23
  let AuthorizationModule = class AuthorizationModule {
24
+ onModuleInit() {
25
+ (0, validate_jwt_env_helper_1.validateJwtEnv)();
26
+ }
22
27
  };
23
28
  exports.AuthorizationModule = AuthorizationModule;
24
29
  exports.AuthorizationModule = AuthorizationModule = __decorate([
@@ -26,7 +31,9 @@ exports.AuthorizationModule = AuthorizationModule = __decorate([
26
31
  (0, common_1.Module)({
27
32
  imports: [
28
33
  passport_1.PassportModule.register({ defaultStrategy: 'jwt', property: 'user' }),
29
- jwt_1.JwtModule.register({}),
34
+ jwt_1.JwtModule.register({
35
+ signOptions: { algorithm: (0, jwt_options_helper_1.resolveJwtAlgorithm)() },
36
+ }),
30
37
  ],
31
38
  controllers: [],
32
39
  providers: [
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.module.js","sourceRoot":"","sources":["../src/authorization.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,qCAAoD;AACpD,+CAAkD;AAClD,sDAAkD;AAClD,0DAAsD;AACtD,sFAAgF;AAChF,kEAA6D;AAC7D,kDAA8C;AAC9C,uCAAoD;AACpD,0DAAqD;AACrD,oEAA+D;AAuBxD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IArB/B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,yBAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACrE,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;SACvB;QACD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE;YACT,wBAAU;YACV,0BAAW;YACX,gBAAU;YACV,oDAAuB;YACvB,gBAAS;YACT,oBAAQ;YACR,EAAE,OAAO,EAAE,gBAAS,EAAE,QAAQ,EAAE,oBAAQ,EAAE;YAC1C,mCAAe;YACf,2BAAW;YACX,qCAAgB;SACjB;QACD,OAAO,EAAE,CAAC,gBAAS,EAAE,wBAAU,EAAE,gBAAU,EAAE,oBAAQ,CAAC;KACvD,CAAC;GACW,mBAAmB,CAAG"}
1
+ {"version":3,"file":"authorization.module.js","sourceRoot":"","sources":["../src/authorization.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA8D;AAC9D,8EAAkE;AAClE,qCAAoD;AACpD,+CAAkD;AAClD,sDAAkD;AAClD,oEAAkE;AAClE,0DAAsD;AACtD,sFAAgF;AAChF,kEAA6D;AAC7D,kDAA8C;AAC9C,uCAAoD;AACpD,0DAAqD;AACrD,oEAA+D;AAyBxD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAAY;QACV,IAAA,wCAAc,GAAE,CAAC;IACnB,CAAC;CACF,CAAA;AAJY,kDAAmB;8BAAnB,mBAAmB;IAvB/B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,yBAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACrE,eAAS,CAAC,QAAQ,CAAC;gBACjB,WAAW,EAAE,EAAE,SAAS,EAAE,IAAA,wCAAmB,GAAE,EAAE;aAClD,CAAC;SACH;QACD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE;YACT,wBAAU;YACV,0BAAW;YACX,gBAAU;YACV,oDAAuB;YACvB,gBAAS;YACT,oBAAQ;YACR,EAAE,OAAO,EAAE,gBAAS,EAAE,QAAQ,EAAE,oBAAQ,EAAE;YAC1C,mCAAe;YACf,2BAAW;YACX,qCAAgB;SACjB;QACD,OAAO,EAAE,CAAC,gBAAS,EAAE,wBAAU,EAAE,gBAAU,EAAE,oBAAQ,CAAC;KACvD,CAAC;GACW,mBAAmB,CAI/B"}
@@ -1,4 +1,5 @@
1
1
  import { CanActivate, ExecutionContext } from '@nestjs/common';
2
2
  export declare class ApiKeyGuard implements CanActivate {
3
3
  canActivate(context: ExecutionContext): Promise<boolean>;
4
+ private timingSafeCompare;
4
5
  }
@@ -8,20 +8,21 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.ApiKeyGuard = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
+ const crypto_1 = require("crypto");
11
12
  let ApiKeyGuard = class ApiKeyGuard {
12
13
  async canActivate(context) {
13
14
  try {
14
15
  const request = context.switchToHttp().getRequest();
15
16
  const headers = request.headers;
16
17
  const apiKey = headers['x-api-key'];
17
- if (!apiKey) {
18
+ if (!apiKey || typeof apiKey !== 'string') {
18
19
  throw new common_1.UnauthorizedException('api_key_not_provided');
19
20
  }
20
- const API_KEY = process.env.API_KEY;
21
- if (!API_KEY) {
21
+ const configuredKey = process.env.API_KEY;
22
+ if (!configuredKey) {
22
23
  throw new common_1.UnauthorizedException('api_key_not_configured');
23
24
  }
24
- if (apiKey !== API_KEY) {
25
+ if (!this.timingSafeCompare(apiKey, configuredKey)) {
25
26
  throw new common_1.UnauthorizedException('invalid_api_key');
26
27
  }
27
28
  return true;
@@ -30,6 +31,14 @@ let ApiKeyGuard = class ApiKeyGuard {
30
31
  throw error;
31
32
  }
32
33
  }
34
+ timingSafeCompare(provided, expected) {
35
+ const providedBuffer = Buffer.from(provided);
36
+ const expectedBuffer = Buffer.from(expected);
37
+ if (providedBuffer.length !== expectedBuffer.length) {
38
+ return false;
39
+ }
40
+ return (0, crypto_1.timingSafeEqual)(providedBuffer, expectedBuffer);
41
+ }
33
42
  };
34
43
  exports.ApiKeyGuard = ApiKeyGuard;
35
44
  exports.ApiKeyGuard = ApiKeyGuard = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"api-key.guard.js","sourceRoot":"","sources":["../../src/guards/api-key.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AAGjB,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,8BAAqB,CAAC,sBAAsB,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,8BAAqB,CAAC,wBAAwB,CAAC,CAAC;YAC5D,CAAC;YAGD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAA;AAzBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;GACA,WAAW,CAyBvB"}
1
+ {"version":3,"file":"api-key.guard.js","sourceRoot":"","sources":["../../src/guards/api-key.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AACxB,mCAAyC;AAGlC,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,8BAAqB,CAAC,sBAAsB,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,8BAAqB,CAAC,wBAAwB,CAAC,CAAC;YAC5D,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;QAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE7C,IAAI,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAA,wBAAe,EAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACzD,CAAC;CACF,CAAA;AAnCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;GACA,WAAW,CAmCvB"}
@@ -1,8 +1,10 @@
1
1
  import { CanActivate, ExecutionContext } from '@nestjs/common';
2
2
  import { Reflector } from '@nestjs/core';
3
+ import { AuthHelper } from '../helper/auth.helper';
3
4
  export declare class JwtGuard implements CanActivate {
4
5
  private readonly reflector;
5
- constructor(reflector: Reflector);
6
+ private readonly authHelper;
7
+ constructor(reflector: Reflector, authHelper: AuthHelper);
6
8
  canActivate(context: ExecutionContext): Promise<boolean>;
7
9
  private extractTokenFromHeader;
8
10
  }
@@ -13,10 +13,11 @@ exports.JwtGuard = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const core_1 = require("@nestjs/core");
15
15
  const allow_anonymous_decorator_1 = require("../decorators/allow-anonymous.decorator");
16
- const jsonwebtoken = require("jsonwebtoken");
16
+ const auth_helper_1 = require("../helper/auth.helper");
17
17
  let JwtGuard = class JwtGuard {
18
- constructor(reflector) {
18
+ constructor(reflector, authHelper) {
19
19
  this.reflector = reflector;
20
+ this.authHelper = authHelper;
20
21
  }
21
22
  async canActivate(context) {
22
23
  var _a;
@@ -38,7 +39,7 @@ let JwtGuard = class JwtGuard {
38
39
  if (!secret) {
39
40
  throw new common_1.UnauthorizedException('ConfigurationError', 'JWT_ACCESS_TOKEN_SECRET is not configured');
40
41
  }
41
- const user = jsonwebtoken.verify(token, secret);
42
+ const user = await this.authHelper.verify(token, secret);
42
43
  request.user = user;
43
44
  return true;
44
45
  }
@@ -55,6 +56,7 @@ let JwtGuard = class JwtGuard {
55
56
  exports.JwtGuard = JwtGuard;
56
57
  exports.JwtGuard = JwtGuard = __decorate([
57
58
  (0, common_1.Injectable)(),
58
- __metadata("design:paramtypes", [core_1.Reflector])
59
+ __metadata("design:paramtypes", [core_1.Reflector,
60
+ auth_helper_1.AuthHelper])
59
61
  ], JwtGuard);
60
62
  //# sourceMappingURL=jwt.guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.guard.js","sourceRoot":"","sources":["../../src/guards/jwt.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,uCAAyC;AACzC,uFAAmF;AACnF,6CAA6C;AAGtC,IAAM,QAAQ,GAAd,MAAM,QAAQ;IACnB,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,KAAK,CAAC,WAAW,CAAC,OAAyB;;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAIpD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,kBAAkB,GAAG,MAAA,IAAI,CAAC,SAAS,0CAAE,iBAAiB,CAC1D,oDAAwB,EACxB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;YACF,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,8BAAqB,CAC7B,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,8BAAqB,CAC7B,oBAAoB,EACpB,2CAA2C,CAC5C,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAgB;;QAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,aAAa,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;QACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AAnDY,4BAAQ;mBAAR,QAAQ;IADpB,IAAA,mBAAU,GAAE;qCAE6B,gBAAS;GADtC,QAAQ,CAmDpB"}
1
+ {"version":3,"file":"jwt.guard.js","sourceRoot":"","sources":["../../src/guards/jwt.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,uCAAyC;AACzC,uFAAmF;AACnF,uDAAmD;AAG5C,IAAM,QAAQ,GAAd,MAAM,QAAQ;IACnB,YACmB,SAAoB,EACpB,UAAsB;QADtB,cAAS,GAAT,SAAS,CAAW;QACpB,eAAU,GAAV,UAAU,CAAY;IACtC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAIpD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,kBAAkB,GAAG,MAAA,IAAI,CAAC,SAAS,0CAAE,iBAAiB,CAC1D,oDAAwB,EACxB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;YACF,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,8BAAqB,CAC7B,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,8BAAqB,CAC7B,oBAAoB,EACpB,2CAA2C,CAC5C,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAgB;;QAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,aAAa,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;QACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AAtDY,4BAAQ;mBAAR,QAAQ;IADpB,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;QACR,wBAAU;GAH9B,QAAQ,CAsDpB"}
@@ -28,10 +28,7 @@ let OptionalJwtGuard = class OptionalJwtGuard {
28
28
  }
29
29
  const secret = process.env.JWT_ACCESS_TOKEN_SECRET;
30
30
  if (!secret) {
31
- if (process.env.NODE_ENV === 'production') {
32
- console.warn('JWT_ACCESS_TOKEN_SECRET is not configured');
33
- }
34
- return true;
31
+ throw new common_1.UnauthorizedException('ConfigurationError', 'JWT_ACCESS_TOKEN_SECRET is not configured');
35
32
  }
36
33
  const user = await this.authHelper.verify(token, secret);
37
34
  request.user = user;
@@ -1 +1 @@
1
- {"version":3,"file":"optional-jwt.guard.js","sourceRoot":"","sources":["../../src/guards/optional-jwt.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA2E;AAE3E,uDAAmD;AAG5C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBAGZ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBAC5D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAgB;;QAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,aAAa,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;QACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AAtCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAE8B,wBAAU;GADxC,gBAAgB,CAsC5B"}
1
+ {"version":3,"file":"optional-jwt.guard.js","sourceRoot":"","sources":["../../src/guards/optional-jwt.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,uDAAmD;AAG5C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,8BAAqB,CAC7B,oBAAoB,EACpB,2CAA2C,CAC5C,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAgB;;QAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,aAAa,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;QACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AApCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAE8B,wBAAU;GADxC,gBAAgB,CAoC5B"}
@@ -14,7 +14,7 @@ function PermissionsGuard(permissions) {
14
14
  }
15
15
  const user = request.user;
16
16
  const userPermissions = user === null || user === void 0 ? void 0 : user.permissions;
17
- const isAllowed = requiredPermissions.some((requiredPermission) => userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.find((x) => x == requiredPermission.trim()));
17
+ const isAllowed = requiredPermissions.some((requiredPermission) => userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.find((x) => x === requiredPermission.trim()));
18
18
  return isAllowed;
19
19
  }
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.guard.js","sourceRoot":"","sources":["../../src/guards/permissions.guard.ts"],"names":[],"mappings":";;AAEA,4CA0BC;AA1BD,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,qBAAqB;QACzB,WAAW,CAAC,OAAyB;YACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAEpD,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAC;YAE1C,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAChE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC,CACrE,CAAC;YAEF,OAAO,SAAS,CAAC;QACnB,CAAC;KACF;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"permissions.guard.js","sourceRoot":"","sources":["../../src/guards/permissions.guard.ts"],"names":[],"mappings":";;AAEA,4CA0BC;AA1BD,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,qBAAqB;QACzB,WAAW,CAAC,OAAyB;YACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAEpD,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAC;YAE1C,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAChE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,kBAAkB,CAAC,IAAI,EAAE,CAAC,CACtE,CAAC;YAEF,OAAO,SAAS,CAAC;QACnB,CAAC;KACF;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC"}
@@ -9,10 +9,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.ThrottlerBehindProxyGuard = void 0;
10
10
  const throttler_1 = require("@nestjs/throttler");
11
11
  const common_1 = require("@nestjs/common");
12
+ const get_client_ip_helper_1 = require("../helper/get-client-ip.helper");
12
13
  let ThrottlerBehindProxyGuard = class ThrottlerBehindProxyGuard extends throttler_1.ThrottlerGuard {
13
14
  async getTracker(req) {
14
- var _a;
15
- return ((_a = req.ips) === null || _a === void 0 ? void 0 : _a.length) ? req.ips[0] : req.ip;
15
+ return (0, get_client_ip_helper_1.getClientIp)(req);
16
16
  }
17
17
  };
18
18
  exports.ThrottlerBehindProxyGuard = ThrottlerBehindProxyGuard;
@@ -1 +1 @@
1
- {"version":3,"file":"throttler-behind-proxy.guard.js","sourceRoot":"","sources":["../../src/guards/throttler-behind-proxy.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAAmD;AACnD,2CAA4C;AAMrC,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,0BAAc;IACjD,KAAK,CAAC,UAAU,CAAC,GAAwB;;QACjD,OAAO,CAAA,MAAA,GAAG,CAAC,GAAG,0CAAE,MAAM,EAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/C,CAAC;CACF,CAAA;AAJY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAIrC"}
1
+ {"version":3,"file":"throttler-behind-proxy.guard.js","sourceRoot":"","sources":["../../src/guards/throttler-behind-proxy.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAAmD;AACnD,2CAA4C;AAC5C,yEAA6D;AAMtD,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,0BAAc;IACjD,KAAK,CAAC,UAAU,CAAC,GAAwB;QACjD,OAAO,IAAA,kCAAW,EAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF,CAAA;AAJY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAIrC"}
@@ -0,0 +1,7 @@
1
+ import { CanActivate, Type } from '@nestjs/common';
2
+ export type WebhookSignatureGuardOptions = {
3
+ secretEnvVar?: string;
4
+ headerName?: string;
5
+ algorithm?: 'sha256' | 'sha512';
6
+ };
7
+ export declare function WebhookSignatureGuard(options?: WebhookSignatureGuardOptions): Type<CanActivate>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WebhookSignatureGuard = WebhookSignatureGuard;
10
+ const common_1 = require("@nestjs/common");
11
+ const crypto_1 = require("crypto");
12
+ function WebhookSignatureGuard(options = {}) {
13
+ var _a, _b, _c;
14
+ const secretEnvVar = (_a = options.secretEnvVar) !== null && _a !== void 0 ? _a : 'WEBHOOK_SIGNING_SECRET';
15
+ const headerName = ((_b = options.headerName) !== null && _b !== void 0 ? _b : 'x-webhook-signature').toLowerCase();
16
+ const algorithm = (_c = options.algorithm) !== null && _c !== void 0 ? _c : 'sha256';
17
+ let WebhookSignatureGuardMixin = class WebhookSignatureGuardMixin {
18
+ canActivate(context) {
19
+ var _a, _b;
20
+ const req = context.switchToHttp().getRequest();
21
+ const secret = process.env[secretEnvVar];
22
+ if (!secret) {
23
+ throw new common_1.UnauthorizedException('webhook_secret_not_configured');
24
+ }
25
+ const provided = (_a = req.headers) === null || _a === void 0 ? void 0 : _a[headerName];
26
+ if (!provided || typeof provided !== 'string') {
27
+ throw new common_1.UnauthorizedException('webhook_signature_missing');
28
+ }
29
+ const rawBody = (_b = req.rawBody) !== null && _b !== void 0 ? _b : req.body;
30
+ const payload = typeof rawBody === 'string'
31
+ ? rawBody
32
+ : Buffer.isBuffer(rawBody)
33
+ ? rawBody
34
+ : JSON.stringify(rawBody !== null && rawBody !== void 0 ? rawBody : {});
35
+ const expected = (0, crypto_1.createHmac)(algorithm, secret)
36
+ .update(payload)
37
+ .digest('hex');
38
+ const providedBuffer = Buffer.from(provided);
39
+ const expectedBuffer = Buffer.from(expected);
40
+ if (providedBuffer.length !== expectedBuffer.length) {
41
+ throw new common_1.UnauthorizedException('invalid_webhook_signature');
42
+ }
43
+ if (!(0, crypto_1.timingSafeEqual)(providedBuffer, expectedBuffer)) {
44
+ throw new common_1.UnauthorizedException('invalid_webhook_signature');
45
+ }
46
+ return true;
47
+ }
48
+ };
49
+ WebhookSignatureGuardMixin = __decorate([
50
+ (0, common_1.Injectable)()
51
+ ], WebhookSignatureGuardMixin);
52
+ return WebhookSignatureGuardMixin;
53
+ }
54
+ //# sourceMappingURL=webhook-signature.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-signature.guard.js","sourceRoot":"","sources":["../../src/guards/webhook-signature.guard.ts"],"names":[],"mappings":";;;;;;;;AAeA,sDA+CC;AA9DD,2CAMwB;AACxB,mCAAqD;AAQrD,SAAgB,qBAAqB,CACnC,UAAwC,EAAE;;IAE1C,MAAM,YAAY,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,wBAAwB,CAAC;IACtE,MAAM,UAAU,GAAG,CAAC,MAAA,OAAO,CAAC,UAAU,mCAAI,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/E,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,QAAQ,CAAC;IAGhD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;QAC9B,WAAW,CAAC,OAAyB;;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,8BAAqB,CAAC,+BAA+B,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,QAAQ,GAAG,MAAA,GAAG,CAAC,OAAO,0CAAG,UAAU,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,OAAO,GAAG,MAAA,GAAG,CAAC,OAAO,mCAAI,GAAG,CAAC,IAAI,CAAC;YACxC,MAAM,OAAO,GACX,OAAO,OAAO,KAAK,QAAQ;gBACzB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,SAAS,EAAE,MAAM,CAAC;iBAC3C,MAAM,CAAC,OAAO,CAAC;iBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAEjB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;gBACpD,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,CAAC,IAAA,wBAAe,EAAC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAA;IApCK,0BAA0B;QAD/B,IAAA,mBAAU,GAAE;OACP,0BAA0B,CAoC/B;IAED,OAAO,0BAA0B,CAAC;AACpC,CAAC"}
@@ -14,12 +14,13 @@ const common_1 = require("@nestjs/common");
14
14
  const jwt_1 = require("@nestjs/jwt");
15
15
  const bcrypt = require("bcrypt");
16
16
  const crypto_1 = require("crypto");
17
+ const jwt_options_helper_1 = require("./jwt-options.helper");
17
18
  let AuthHelper = class AuthHelper {
18
19
  constructor(jwt) {
19
20
  this.jwt = jwt;
20
21
  }
21
22
  async verify(token, secret) {
22
- const decoded = this.jwt.verify(token, { secret });
23
+ const decoded = this.jwt.verify(token, (0, jwt_options_helper_1.buildJwtVerifyOptions)(secret));
23
24
  if (!decoded) {
24
25
  throw new common_1.UnauthorizedException('invalid_token');
25
26
  }
@@ -29,27 +30,27 @@ let AuthHelper = class AuthHelper {
29
30
  return this.jwt.decode(token, null);
30
31
  }
31
32
  generateAccessToken(payload) {
32
- return this.jwt.sign(Object.assign({}, payload), {
33
+ return this.jwt.sign(Object.assign({}, payload), (0, jwt_options_helper_1.buildJwtSignOptions)({
33
34
  secret: process.env.JWT_ACCESS_TOKEN_SECRET,
34
35
  expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRES,
35
- });
36
+ }));
36
37
  }
37
38
  generateRefreshToken(payload) {
38
- return this.jwt.sign(Object.assign({}, payload), {
39
+ return this.jwt.sign(Object.assign({}, payload), (0, jwt_options_helper_1.buildJwtSignOptions)({
39
40
  secret: process.env.JWT_REFRESH_TOKEN_SECRET,
40
41
  expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRES,
41
- });
42
+ }));
42
43
  }
43
44
  async generateToken(account) {
44
45
  const [accessToken, refreshToken] = await Promise.all([
45
- this.jwt.signAsync({ id: account.id, email: account.email }, {
46
+ this.jwt.signAsync({ id: account.id, email: account.email }, (0, jwt_options_helper_1.buildJwtSignOptions)({
46
47
  secret: process.env.JWT_ACCESS_TOKEN_SECRET,
47
48
  expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRES,
48
- }),
49
- this.jwt.signAsync({ id: account.id }, {
49
+ })),
50
+ this.jwt.signAsync({ id: account.id }, (0, jwt_options_helper_1.buildJwtSignOptions)({
50
51
  secret: process.env.JWT_REFRESH_TOKEN_SECRET,
51
52
  expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRES,
52
- }),
53
+ })),
53
54
  ]);
54
55
  return { accessToken, refreshToken };
55
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth.helper.js","sourceRoot":"","sources":["../../src/helper/auth.helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.helper.js","sourceRoot":"","sources":["../../src/helper/auth.helper.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmE;AACnE,qCAAyC;AACzC,iCAAiC;AACjC,mCAAmC;AAEnC,6DAG8B;AAGvB,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,YAA6B,GAAe;QAAf,QAAG,GAAH,GAAG,CAAY;IAAG,CAAC;IAEzC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAc;QAC/C,MAAM,OAAO,GAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAA,0CAAqB,EAAC,MAAM,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,8BAAqB,CAAC,eAAe,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAGM,KAAK,CAAC,MAAM,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAGM,mBAAmB,CAAC,OAAY;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,mBACb,OAAO,GACZ,IAAA,wCAAmB,EAAC;YAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YAC3C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAuC;SAC/D,CAAC,CACH,CAAC;IACJ,CAAC;IAGM,oBAAoB,CAAC,OAAY;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,mBACb,OAAO,GACZ,IAAA,wCAAmB,EAAC;YAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;YAC5C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAwC;SAChE,CAAC,CACH,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAY;QACrC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,SAAS,CAChB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EACxC,IAAA,wCAAmB,EAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;gBAC3C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAuC;aAC/D,CAAC,CACH;YACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAChB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAClB,IAAA,wCAAmB,EAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;gBAC5C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAwC;aAChE,CAAC,CACH;SACF,CAAC,CAAC;QAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IACvC,CAAC;IAGM,kBAAkB,CACvB,aAAqB,EACrB,WAAmB;QAEnB,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAGM,cAAc,CAAC,QAAgB;QACpC,MAAM,IAAI,GAAW,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAE5C,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAGM,WAAW;QAEhB,MAAM,YAAY,GAAG,IAAA,kBAAS,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAEM,yBAAyB,CAC9B,QAAgB,EAChB,QAAgB,EAChB,GAAW,EACX,QAAgB;QAEhB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAwDS,QAAQ;;;;;;;;;;;;;gEAaoC,QAAQ;;;;;;;;;;;;;;;;;;;;;gBAqBxD,QAAQ;;;;;;;;;;;;;;;;;;;;;;gBAsBR,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGlB,CAAC;IACA,CAAC;CACF,CAAA;AAhTY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAEuB,gBAAU;GADjC,UAAU,CAgTtB"}
@@ -0,0 +1,12 @@
1
+ export type ClientIpRequest = {
2
+ ip?: string;
3
+ ips?: string[];
4
+ headers?: Record<string, string | string[] | undefined>;
5
+ socket?: {
6
+ remoteAddress?: string;
7
+ };
8
+ connection?: {
9
+ remoteAddress?: string;
10
+ };
11
+ };
12
+ export declare function getClientIp(req: ClientIpRequest): string;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getClientIp = getClientIp;
4
+ function getClientIp(req) {
5
+ var _a, _b, _c, _d, _e, _f, _g, _h;
6
+ if ((_a = req.ips) === null || _a === void 0 ? void 0 : _a.length) {
7
+ return req.ips[0];
8
+ }
9
+ if (req.ip) {
10
+ return req.ip;
11
+ }
12
+ const xff = (_b = req.headers) === null || _b === void 0 ? void 0 : _b['x-forwarded-for'];
13
+ if (xff) {
14
+ const raw = Array.isArray(xff) ? xff[0] : xff;
15
+ const first = (_c = raw.split(',')[0]) === null || _c === void 0 ? void 0 : _c.trim();
16
+ if (first) {
17
+ return first;
18
+ }
19
+ }
20
+ const realIp = (_d = req.headers) === null || _d === void 0 ? void 0 : _d['x-real-ip'];
21
+ if (realIp) {
22
+ return Array.isArray(realIp) ? realIp[0] : realIp;
23
+ }
24
+ return ((_h = (_f = (_e = req.socket) === null || _e === void 0 ? void 0 : _e.remoteAddress) !== null && _f !== void 0 ? _f : (_g = req.connection) === null || _g === void 0 ? void 0 : _g.remoteAddress) !== null && _h !== void 0 ? _h : 'unknown');
25
+ }
26
+ //# sourceMappingURL=get-client-ip.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-client-ip.helper.js","sourceRoot":"","sources":["../../src/helper/get-client-ip.helper.ts"],"names":[],"mappings":";;AAaA,kCA4BC;AA5BD,SAAgB,WAAW,CAAC,GAAoB;;IAC9C,IAAI,MAAA,GAAG,CAAC,GAAG,0CAAE,MAAM,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,MAAA,GAAG,CAAC,OAAO,0CAAG,iBAAiB,CAAC,CAAC;IAC7C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAA,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,EAAE,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAA,GAAG,CAAC,OAAO,0CAAG,WAAW,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,CAAC;IAED,OAAO,CACL,MAAA,MAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,aAAa,mCACzB,MAAA,GAAG,CAAC,UAAU,0CAAE,aAAa,mCAC7B,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Algorithm } from 'jsonwebtoken';
2
+ import { StringValue } from './jwt.type';
3
+ export declare const HMAC_JWT_ALGORITHMS: readonly ["HS256", "HS384", "HS512"];
4
+ export type HmacJwtAlgorithm = (typeof HMAC_JWT_ALGORITHMS)[number];
5
+ export declare function resolveJwtAlgorithm(): HmacJwtAlgorithm;
6
+ export declare function buildJwtSignOptions(opts: {
7
+ secret: string;
8
+ expiresIn?: StringValue;
9
+ }): {
10
+ algorithm: Algorithm;
11
+ secret: string;
12
+ expiresIn?: StringValue;
13
+ };
14
+ export declare function buildJwtVerifyOptions(secret: string): {
15
+ secret: string;
16
+ algorithms: Algorithm[];
17
+ };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HMAC_JWT_ALGORITHMS = void 0;
4
+ exports.resolveJwtAlgorithm = resolveJwtAlgorithm;
5
+ exports.buildJwtSignOptions = buildJwtSignOptions;
6
+ exports.buildJwtVerifyOptions = buildJwtVerifyOptions;
7
+ exports.HMAC_JWT_ALGORITHMS = ['HS256', 'HS384', 'HS512'];
8
+ const DEFAULT_JWT_ALGORITHM = 'HS256';
9
+ function resolveJwtAlgorithm() {
10
+ var _a;
11
+ const fromEnv = (_a = process.env.JWT_ALGORITHM) === null || _a === void 0 ? void 0 : _a.trim();
12
+ const algorithm = (fromEnv || DEFAULT_JWT_ALGORITHM);
13
+ if (!exports.HMAC_JWT_ALGORITHMS.includes(algorithm)) {
14
+ throw new Error(`JWT_ALGORITHM must be one of: ${exports.HMAC_JWT_ALGORITHMS.join(', ')}`);
15
+ }
16
+ return algorithm;
17
+ }
18
+ function buildJwtSignOptions(opts) {
19
+ return Object.assign(Object.assign({}, opts), { algorithm: resolveJwtAlgorithm() });
20
+ }
21
+ function buildJwtVerifyOptions(secret) {
22
+ return {
23
+ secret,
24
+ algorithms: [resolveJwtAlgorithm()],
25
+ };
26
+ }
27
+ //# sourceMappingURL=jwt-options.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-options.helper.js","sourceRoot":"","sources":["../../src/helper/jwt-options.helper.ts"],"names":[],"mappings":";;;AASA,kDAWC;AAED,kDAQC;AAED,sDAKC;AAlCY,QAAA,mBAAmB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAIxE,MAAM,qBAAqB,GAAqB,OAAO,CAAC;AAExD,SAAgB,mBAAmB;;IACjC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,aAAa,0CAAE,IAAI,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAqB,CAAC;IAEzE,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,iCAAiC,2BAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAGnC;IACC,uCACK,IAAI,KACP,SAAS,EAAE,mBAAmB,EAAe,IAC7C;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAc;IAClD,OAAO;QACL,MAAM;QACN,UAAU,EAAE,CAAC,mBAAmB,EAAe,CAAC;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type ValidateJwtEnvOptions = {
2
+ required?: boolean;
3
+ };
4
+ export declare function validateJwtEnv(options?: ValidateJwtEnvOptions): void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateJwtEnv = validateJwtEnv;
4
+ function validateJwtEnv(options = {}) {
5
+ const { required = true } = options;
6
+ if (!required) {
7
+ return;
8
+ }
9
+ if (!process.env.JWT_ACCESS_TOKEN_SECRET) {
10
+ throw new Error('JWT_ACCESS_TOKEN_SECRET is required');
11
+ }
12
+ if (!process.env.JWT_REFRESH_TOKEN_SECRET) {
13
+ throw new Error('JWT_REFRESH_TOKEN_SECRET is required');
14
+ }
15
+ }
16
+ //# sourceMappingURL=validate-jwt-env.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-jwt-env.helper.js","sourceRoot":"","sources":["../../src/helper/validate-jwt-env.helper.ts"],"names":[],"mappings":";;AAKA,wCAYC;AAZD,SAAgB,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,9 +6,13 @@ export * from './guards/permissions.guard';
6
6
  export * from './helper/auth.helper';
7
7
  export * from './guards/jwt-refresh.guard';
8
8
  export * from './guards/api-key.guard';
9
+ export * from './guards/webhook-signature.guard';
9
10
  export * from './guards/vendor.guard';
10
11
  export * from './guards/optional-jwt.guard';
11
12
  export * from './strategy/jwt-refresh-token.strategy';
12
13
  export * from './strategy/jwt.strategy';
13
14
  export * from './models/auth.model';
14
15
  export * from './helper/jwt.type';
16
+ export * from './helper/jwt-options.helper';
17
+ export * from './helper/validate-jwt-env.helper';
18
+ export * from './helper/get-client-ip.helper';
package/dist/index.js CHANGED
@@ -25,10 +25,14 @@ __exportStar(require("./guards/permissions.guard"), exports);
25
25
  __exportStar(require("./helper/auth.helper"), exports);
26
26
  __exportStar(require("./guards/jwt-refresh.guard"), exports);
27
27
  __exportStar(require("./guards/api-key.guard"), exports);
28
+ __exportStar(require("./guards/webhook-signature.guard"), exports);
28
29
  __exportStar(require("./guards/vendor.guard"), exports);
29
30
  __exportStar(require("./guards/optional-jwt.guard"), exports);
30
31
  __exportStar(require("./strategy/jwt-refresh-token.strategy"), exports);
31
32
  __exportStar(require("./strategy/jwt.strategy"), exports);
32
33
  __exportStar(require("./models/auth.model"), exports);
33
34
  __exportStar(require("./helper/jwt.type"), exports);
35
+ __exportStar(require("./helper/jwt-options.helper"), exports);
36
+ __exportStar(require("./helper/validate-jwt-env.helper"), exports);
37
+ __exportStar(require("./helper/get-client-ip.helper"), exports);
34
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+DAA6D;AAApD,2HAAA,mBAAmB,OAAA;AAC5B,gDAA8C;AAArC,qGAAA,QAAQ,OAAA;AACjB,yEAAuD;AACvD,sEAAoD;AACpD,6DAA2C;AAC3C,uDAAqC;AACrC,6DAA2C;AAC3C,yDAAuC;AACvC,wDAAsC;AACtC,8DAA4C;AAC5C,wEAAsD;AACtD,0DAAwC;AACxC,sDAAoC;AACpC,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+DAA6D;AAApD,2HAAA,mBAAmB,OAAA;AAC5B,gDAA8C;AAArC,qGAAA,QAAQ,OAAA;AACjB,yEAAuD;AACvD,sEAAoD;AACpD,6DAA2C;AAC3C,uDAAqC;AACrC,6DAA2C;AAC3C,yDAAuC;AACvC,mEAAiD;AACjD,wDAAsC;AACtC,8DAA4C;AAC5C,wEAAsD;AACtD,0DAAwC;AACxC,sDAAoC;AACpC,oDAAkC;AAClC,8DAA4C;AAC5C,mEAAiD;AACjD,gEAA8C"}
@@ -1,22 +1,36 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.JwtRefreshTokenStrategy = void 0;
4
13
  const common_1 = require("@nestjs/common");
5
14
  const passport_1 = require("@nestjs/passport");
6
15
  const passport_jwt_1 = require("passport-jwt");
7
- (0, common_1.Injectable)();
8
- class JwtRefreshTokenStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy, 'jwt-refresh') {
16
+ const jwt_options_helper_1 = require("../helper/jwt-options.helper");
17
+ let JwtRefreshTokenStrategy = class JwtRefreshTokenStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy, 'jwt-refresh') {
9
18
  constructor() {
10
19
  const strategyOptions = {
11
20
  jwtFromRequest: (req) => req.body.refresh_token,
12
21
  ignoreExpiration: false,
13
22
  secretOrKey: process.env.JWT_REFRESH_TOKEN_SECRET,
23
+ algorithms: [(0, jwt_options_helper_1.resolveJwtAlgorithm)()],
14
24
  };
15
25
  super(strategyOptions);
16
26
  }
17
27
  async validate(payload) {
18
28
  return payload;
19
29
  }
20
- }
30
+ };
21
31
  exports.JwtRefreshTokenStrategy = JwtRefreshTokenStrategy;
32
+ exports.JwtRefreshTokenStrategy = JwtRefreshTokenStrategy = __decorate([
33
+ (0, common_1.Injectable)(),
34
+ __metadata("design:paramtypes", [])
35
+ ], JwtRefreshTokenStrategy);
22
36
  //# sourceMappingURL=jwt-refresh-token.strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-refresh-token.strategy.js","sourceRoot":"","sources":["../../src/strategy/jwt-refresh-token.strategy.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAC5C,+CAAoD;AACpD,+CAAyD;AAEzD,IAAA,mBAAU,GAAE,CAAC;AACb,MAAa,uBAAwB,SAAQ,IAAA,2BAAgB,EAC3D,uBAAQ,EACR,aAAa,CACd;IACC;QACE,MAAM,eAAe,GAAoB;YACvC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa;YAC/C,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;SAClD,CAAC;QAEF,KAAK,CAAC,eAAe,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAY;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAjBD,0DAiBC"}
1
+ {"version":3,"file":"jwt-refresh-token.strategy.js","sourceRoot":"","sources":["../../src/strategy/jwt-refresh-token.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+CAAoD;AACpD,+CAAyD;AACzD,qEAAmE;AAG5D,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,IAAA,2BAAgB,EAC3D,uBAAQ,EACR,aAAa,CACd;IACC;QACE,MAAM,eAAe,GAAoB;YACvC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa;YAC/C,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACjD,UAAU,EAAE,CAAC,IAAA,wCAAmB,GAAE,CAAC;SACpC,CAAC;QAEF,KAAK,CAAC,eAAe,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAY;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAlBY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;;GACA,uBAAuB,CAkBnC"}
@@ -1,22 +1,36 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.JwtStrategy = void 0;
4
13
  const common_1 = require("@nestjs/common");
5
14
  const passport_1 = require("@nestjs/passport");
6
15
  const passport_jwt_1 = require("passport-jwt");
7
- (0, common_1.Injectable)();
8
- class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
16
+ const jwt_options_helper_1 = require("../helper/jwt-options.helper");
17
+ let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
9
18
  constructor() {
10
19
  const strategyOptions = {
11
20
  jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
12
21
  ignoreExpiration: false,
13
22
  secretOrKey: process.env.JWT_ACCESS_TOKEN_SECRET,
23
+ algorithms: [(0, jwt_options_helper_1.resolveJwtAlgorithm)()],
14
24
  };
15
25
  super(strategyOptions);
16
26
  }
17
27
  async validate(payload) {
18
28
  return payload;
19
29
  }
20
- }
30
+ };
21
31
  exports.JwtStrategy = JwtStrategy;
32
+ exports.JwtStrategy = JwtStrategy = __decorate([
33
+ (0, common_1.Injectable)(),
34
+ __metadata("design:paramtypes", [])
35
+ ], JwtStrategy);
22
36
  //# sourceMappingURL=jwt.strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../src/strategy/jwt.strategy.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAC5C,+CAAoD;AACpD,+CAAqE;AAErE,IAAA,mBAAU,GAAE,CAAC;AACb,MAAa,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD;QACE,MAAM,eAAe,GAAoB;YACvC,cAAc,EAAE,yBAAU,CAAC,2BAA2B,EAAE;YACxD,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;SACjD,CAAC;QAEF,KAAK,CAAC,eAAe,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAY;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAdD,kCAcC"}
1
+ {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../src/strategy/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+CAAoD;AACpD,+CAAqE;AACrE,qEAAmE;AAG5D,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD;QACE,MAAM,eAAe,GAAoB;YACvC,cAAc,EAAE,yBAAU,CAAC,2BAA2B,EAAE;YACxD,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YAChD,UAAU,EAAE,CAAC,IAAA,wCAAmB,GAAE,CAAC;SACpC,CAAC;QAEF,KAAK,CAAC,eAAe,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAY;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAfY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;;GACA,WAAW,CAevB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zola_do/authorization",
3
- "version": "0.2.15",
3
+ "version": "0.2.16",
4
4
  "description": "JWT auth, guards, strategies for NestJS",
5
5
  "author": "zolaDO",
6
6
  "license": "ISC",