@globaltracking/auth-middleware 2.0.0

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 (118) hide show
  1. package/README.md +372 -0
  2. package/dist/config.d.ts +9 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +110 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/errors.d.ts +26 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +42 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/extract-user.d.ts +10 -0
  11. package/dist/extract-user.d.ts.map +1 -0
  12. package/dist/extract-user.js +30 -0
  13. package/dist/extract-user.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +42 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/middlewares/authenticate.d.ts +10 -0
  19. package/dist/middlewares/authenticate.d.ts.map +1 -0
  20. package/dist/middlewares/authenticate.js +26 -0
  21. package/dist/middlewares/authenticate.js.map +1 -0
  22. package/dist/middlewares/error-handler.d.ts +12 -0
  23. package/dist/middlewares/error-handler.d.ts.map +1 -0
  24. package/dist/middlewares/error-handler.js +22 -0
  25. package/dist/middlewares/error-handler.js.map +1 -0
  26. package/dist/middlewares/require-permission.d.ts +12 -0
  27. package/dist/middlewares/require-permission.d.ts.map +1 -0
  28. package/dist/middlewares/require-permission.js +63 -0
  29. package/dist/middlewares/require-permission.js.map +1 -0
  30. package/dist/middlewares/require-role.d.ts +12 -0
  31. package/dist/middlewares/require-role.d.ts.map +1 -0
  32. package/dist/middlewares/require-role.js +30 -0
  33. package/dist/middlewares/require-role.js.map +1 -0
  34. package/dist/middlewares/require-self.d.ts +10 -0
  35. package/dist/middlewares/require-self.d.ts.map +1 -0
  36. package/dist/middlewares/require-self.js +40 -0
  37. package/dist/middlewares/require-self.js.map +1 -0
  38. package/dist/middlewares/require-tenant.d.ts +11 -0
  39. package/dist/middlewares/require-tenant.d.ts.map +1 -0
  40. package/dist/middlewares/require-tenant.js +25 -0
  41. package/dist/middlewares/require-tenant.js.map +1 -0
  42. package/dist/nestjs/constants.d.ts +5 -0
  43. package/dist/nestjs/constants.d.ts.map +1 -0
  44. package/dist/nestjs/constants.js +8 -0
  45. package/dist/nestjs/constants.js.map +1 -0
  46. package/dist/nestjs/decorators/index.d.ts +44 -0
  47. package/dist/nestjs/decorators/index.d.ts.map +1 -0
  48. package/dist/nestjs/decorators/index.js +61 -0
  49. package/dist/nestjs/decorators/index.js.map +1 -0
  50. package/dist/nestjs/filters/auth-exception.filter.d.ts +16 -0
  51. package/dist/nestjs/filters/auth-exception.filter.d.ts.map +1 -0
  52. package/dist/nestjs/filters/auth-exception.filter.js +37 -0
  53. package/dist/nestjs/filters/auth-exception.filter.js.map +1 -0
  54. package/dist/nestjs/gt-auth.module.d.ts +31 -0
  55. package/dist/nestjs/gt-auth.module.d.ts.map +1 -0
  56. package/dist/nestjs/gt-auth.module.js +102 -0
  57. package/dist/nestjs/gt-auth.module.js.map +1 -0
  58. package/dist/nestjs/guards/auth.guard.d.ts +13 -0
  59. package/dist/nestjs/guards/auth.guard.d.ts.map +1 -0
  60. package/dist/nestjs/guards/auth.guard.js +53 -0
  61. package/dist/nestjs/guards/auth.guard.js.map +1 -0
  62. package/dist/nestjs/guards/internal-only.guard.d.ts +15 -0
  63. package/dist/nestjs/guards/internal-only.guard.d.ts.map +1 -0
  64. package/dist/nestjs/guards/internal-only.guard.js +51 -0
  65. package/dist/nestjs/guards/internal-only.guard.js.map +1 -0
  66. package/dist/nestjs/guards/permissions.guard.d.ts +23 -0
  67. package/dist/nestjs/guards/permissions.guard.d.ts.map +1 -0
  68. package/dist/nestjs/guards/permissions.guard.js +134 -0
  69. package/dist/nestjs/guards/permissions.guard.js.map +1 -0
  70. package/dist/nestjs/index.d.ts +12 -0
  71. package/dist/nestjs/index.d.ts.map +1 -0
  72. package/dist/nestjs/index.js +40 -0
  73. package/dist/nestjs/index.js.map +1 -0
  74. package/dist/nestjs/interceptors/org-context.interceptor.d.ts +21 -0
  75. package/dist/nestjs/interceptors/org-context.interceptor.d.ts.map +1 -0
  76. package/dist/nestjs/interceptors/org-context.interceptor.js +63 -0
  77. package/dist/nestjs/interceptors/org-context.interceptor.js.map +1 -0
  78. package/dist/nestjs/middleware/trusted-headers.middleware.d.ts +15 -0
  79. package/dist/nestjs/middleware/trusted-headers.middleware.d.ts.map +1 -0
  80. package/dist/nestjs/middleware/trusted-headers.middleware.js +42 -0
  81. package/dist/nestjs/middleware/trusted-headers.middleware.js.map +1 -0
  82. package/dist/nestjs.d.ts +2 -0
  83. package/dist/nestjs.d.ts.map +1 -0
  84. package/dist/nestjs.js +18 -0
  85. package/dist/nestjs.js.map +1 -0
  86. package/dist/strategies/gateway-header.strategy.d.ts +13 -0
  87. package/dist/strategies/gateway-header.strategy.d.ts.map +1 -0
  88. package/dist/strategies/gateway-header.strategy.js +51 -0
  89. package/dist/strategies/gateway-header.strategy.js.map +1 -0
  90. package/dist/strategies/index.d.ts +5 -0
  91. package/dist/strategies/index.d.ts.map +1 -0
  92. package/dist/strategies/index.js +10 -0
  93. package/dist/strategies/index.js.map +1 -0
  94. package/dist/strategies/jwt.strategy.d.ts +13 -0
  95. package/dist/strategies/jwt.strategy.d.ts.map +1 -0
  96. package/dist/strategies/jwt.strategy.js +94 -0
  97. package/dist/strategies/jwt.strategy.js.map +1 -0
  98. package/dist/strategies/strategy.interface.d.ts +15 -0
  99. package/dist/strategies/strategy.interface.d.ts.map +1 -0
  100. package/dist/strategies/strategy.interface.js +3 -0
  101. package/dist/strategies/strategy.interface.js.map +1 -0
  102. package/dist/strategies/trusted-headers.strategy.d.ts +16 -0
  103. package/dist/strategies/trusted-headers.strategy.d.ts.map +1 -0
  104. package/dist/strategies/trusted-headers.strategy.js +50 -0
  105. package/dist/strategies/trusted-headers.strategy.js.map +1 -0
  106. package/dist/types.d.ts +78 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +3 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/utils/helpers.d.ts +14 -0
  111. package/dist/utils/helpers.d.ts.map +1 -0
  112. package/dist/utils/helpers.js +26 -0
  113. package/dist/utils/helpers.js.map +1 -0
  114. package/dist/utils/jwt.d.ts +12 -0
  115. package/dist/utils/jwt.d.ts.map +1 -0
  116. package/dist/utils/jwt.js +104 -0
  117. package/dist/utils/jwt.js.map +1 -0
  118. package/package.json +82 -0
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.verifyToken = verifyToken;
37
+ exports.decodeGatewayHeader = decodeGatewayHeader;
38
+ const jwt = __importStar(require("jsonwebtoken"));
39
+ const config_1 = require("../config");
40
+ const errors_1 = require("../errors");
41
+ /**
42
+ * Verify a JWT token using the configured RS256 public key.
43
+ * @deprecated Use JwtStrategy directly via extractUser(). Kept for backward compat.
44
+ */
45
+ function verifyToken(token) {
46
+ const config = (0, config_1.getConfig)();
47
+ if (!config.publicKey) {
48
+ throw new errors_1.UnauthorizedError('JWT verification not configured — no public key available');
49
+ }
50
+ let decoded;
51
+ try {
52
+ decoded = jwt.verify(token, config.publicKey, {
53
+ algorithms: ['RS256'],
54
+ issuer: config.jwtIssuer || undefined,
55
+ });
56
+ }
57
+ catch (err) {
58
+ if (err instanceof jwt.TokenExpiredError) {
59
+ throw new errors_1.UnauthorizedError('Token has expired');
60
+ }
61
+ if (err instanceof jwt.JsonWebTokenError) {
62
+ throw new errors_1.UnauthorizedError(`Invalid token: ${err.message}`);
63
+ }
64
+ throw new errors_1.UnauthorizedError('Token verification failed');
65
+ }
66
+ return mapPayloadToUser(decoded, 'jwt');
67
+ }
68
+ /**
69
+ * Decode a base64-encoded JSON gateway header into AuthUser.
70
+ * @deprecated Use GatewayHeaderStrategy directly via extractUser(). Kept for backward compat.
71
+ */
72
+ function decodeGatewayHeader(base64Value) {
73
+ let decoded;
74
+ try {
75
+ decoded = Buffer.from(base64Value, 'base64').toString('utf-8');
76
+ }
77
+ catch {
78
+ throw new errors_1.UnauthorizedError('Invalid gateway header encoding');
79
+ }
80
+ let payload;
81
+ try {
82
+ payload = JSON.parse(decoded);
83
+ }
84
+ catch {
85
+ throw new errors_1.UnauthorizedError('Invalid gateway header JSON');
86
+ }
87
+ return mapPayloadToUser(payload, 'gateway-header');
88
+ }
89
+ function mapPayloadToUser(payload, authSource) {
90
+ if (!payload.sub) {
91
+ throw new errors_1.UnauthorizedError('Token missing required claim: sub');
92
+ }
93
+ return {
94
+ userId: payload.sub,
95
+ email: payload.email || '',
96
+ role: payload.role || '',
97
+ tenantId: payload.tenant_id || payload.org_id || '',
98
+ orgId: payload.org_id || '',
99
+ permissions: Array.isArray(payload.permissions) ? payload.permissions : [],
100
+ requestId: '',
101
+ authSource,
102
+ };
103
+ }
104
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,kCA2BC;AAMD,kDAkBC;AA5DD,kDAAoC;AACpC,sCAAsC;AAEtC,sCAA8C;AAE9C;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,0BAAiB,CACzB,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,OAAmB,CAAC;IAExB,IAAI,CAAC;QACH,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE;YAC5C,UAAU,EAAE,CAAC,OAAO,CAAC;YACrB,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;SACtC,CAAe,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACzC,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,GAAG,YAAY,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACzC,MAAM,IAAI,0BAAiB,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,0BAAiB,CAAC,2BAA2B,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,IAAI,OAAe,CAAC;IAEpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,0BAAiB,CAAC,iCAAiC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,OAAmB,CAAC;IAExB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,0BAAiB,CAAC,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAmB,EAAE,UAAoC;IACjF,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,0BAAiB,CAAC,mCAAmC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG;QACnB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;QACnD,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC3B,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAC1E,SAAS,EAAE,EAAE;QACb,UAAU;KACX,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@globaltracking/auth-middleware",
3
+ "version": "2.0.0",
4
+ "description": "Unified authentication and authorization middleware for the Global Tracking platform (Express + NestJS)",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./nestjs": {
13
+ "types": "./dist/nestjs.d.ts",
14
+ "default": "./dist/nestjs.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.build.json",
22
+ "clean": "rm -rf dist",
23
+ "prebuild": "npm run clean",
24
+ "test": "jest --coverage",
25
+ "test:watch": "jest --watch",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "globaltracking",
30
+ "auth",
31
+ "middleware",
32
+ "express",
33
+ "nestjs",
34
+ "rbac",
35
+ "multi-tenant",
36
+ "jwt",
37
+ "rls"
38
+ ],
39
+ "author": "GeoSentry",
40
+ "license": "UNLICENSED",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/TrackCongoInfra/gt-auth-middleware.git"
44
+ },
45
+ "publishConfig": {
46
+ "registry": "https://registry.npmjs.org",
47
+ "access": "public"
48
+ },
49
+ "peerDependencies": {
50
+ "express": "^4.18.0",
51
+ "@nestjs/common": "^11.0.0",
52
+ "@nestjs/core": "^11.0.0",
53
+ "typeorm": "^0.3.0",
54
+ "rxjs": "^7.0.0"
55
+ },
56
+ "peerDependenciesMeta": {
57
+ "@nestjs/common": { "optional": true },
58
+ "@nestjs/core": { "optional": true },
59
+ "typeorm": { "optional": true },
60
+ "rxjs": { "optional": true }
61
+ },
62
+ "dependencies": {
63
+ "jsonwebtoken": "^9.0.2"
64
+ },
65
+ "devDependencies": {
66
+ "@nestjs/common": "^11.1.18",
67
+ "@nestjs/core": "^11.1.18",
68
+ "@nestjs/testing": "^11.1.18",
69
+ "@types/express": "^4.17.21",
70
+ "@types/jest": "^29.5.14",
71
+ "@types/jsonwebtoken": "^9.0.9",
72
+ "@types/node": "^22.0.0",
73
+ "express": "^4.21.0",
74
+ "jest": "^29.7.0",
75
+ "reflect-metadata": "^0.2.2",
76
+ "rxjs": "^7.8.2",
77
+ "ts-jest": "^29.2.5",
78
+ "ts-node": "^10.9.2",
79
+ "typeorm": "^0.3.28",
80
+ "typescript": "^5.7.3"
81
+ }
82
+ }