@wazobiatech/auth-middleware 1.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 (66) hide show
  1. package/README.md +986 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +25 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/middlewares/express.helper.d.ts +4 -0
  7. package/dist/middlewares/express.helper.d.ts.map +1 -0
  8. package/dist/middlewares/express.helper.js +31 -0
  9. package/dist/middlewares/express.helper.js.map +1 -0
  10. package/dist/middlewares/gql.helper.d.ts +14 -0
  11. package/dist/middlewares/gql.helper.d.ts.map +1 -0
  12. package/dist/middlewares/gql.helper.js +82 -0
  13. package/dist/middlewares/gql.helper.js.map +1 -0
  14. package/dist/middlewares/index.d.ts +5 -0
  15. package/dist/middlewares/index.d.ts.map +1 -0
  16. package/dist/middlewares/index.js +13 -0
  17. package/dist/middlewares/index.js.map +1 -0
  18. package/dist/middlewares/jwt.guard.d.ts +16 -0
  19. package/dist/middlewares/jwt.guard.d.ts.map +1 -0
  20. package/dist/middlewares/jwt.guard.js +336 -0
  21. package/dist/middlewares/jwt.guard.js.map +1 -0
  22. package/dist/middlewares/project.guard.d.ts +49 -0
  23. package/dist/middlewares/project.guard.d.ts.map +1 -0
  24. package/dist/middlewares/project.guard.js +310 -0
  25. package/dist/middlewares/project.guard.js.map +1 -0
  26. package/dist/nestjs/decorators/auth.decorator.d.ts +2 -0
  27. package/dist/nestjs/decorators/auth.decorator.d.ts.map +1 -0
  28. package/dist/nestjs/decorators/auth.decorator.js +10 -0
  29. package/dist/nestjs/decorators/auth.decorator.js.map +1 -0
  30. package/dist/nestjs/decorators/current-user.decorator.d.ts +2 -0
  31. package/dist/nestjs/decorators/current-user.decorator.d.ts.map +1 -0
  32. package/dist/nestjs/decorators/current-user.decorator.js +18 -0
  33. package/dist/nestjs/decorators/current-user.decorator.js.map +1 -0
  34. package/dist/nestjs/guards/jwt-guard.d.ts +8 -0
  35. package/dist/nestjs/guards/jwt-guard.d.ts.map +1 -0
  36. package/dist/nestjs/guards/jwt-guard.js +23 -0
  37. package/dist/nestjs/guards/jwt-guard.js.map +1 -0
  38. package/dist/nestjs/guards/project.guard.d.ts +45 -0
  39. package/dist/nestjs/guards/project.guard.d.ts.map +1 -0
  40. package/dist/nestjs/guards/project.guard.js +352 -0
  41. package/dist/nestjs/guards/project.guard.js.map +1 -0
  42. package/dist/nestjs/index.d.ts +6 -0
  43. package/dist/nestjs/index.d.ts.map +1 -0
  44. package/dist/nestjs/index.js +14 -0
  45. package/dist/nestjs/index.js.map +1 -0
  46. package/dist/nestjs/jwt-auth.module.d.ts +3 -0
  47. package/dist/nestjs/jwt-auth.module.d.ts.map +1 -0
  48. package/dist/nestjs/jwt-auth.module.js +25 -0
  49. package/dist/nestjs/jwt-auth.module.js.map +1 -0
  50. package/dist/nestjs/strategies/jwt-strategy.d.ts +23 -0
  51. package/dist/nestjs/strategies/jwt-strategy.d.ts.map +1 -0
  52. package/dist/nestjs/strategies/jwt-strategy.js +381 -0
  53. package/dist/nestjs/strategies/jwt-strategy.js.map +1 -0
  54. package/dist/test/middleware.test.d.ts +2 -0
  55. package/dist/test/middleware.test.d.ts.map +1 -0
  56. package/dist/test/middleware.test.js +383 -0
  57. package/dist/test/middleware.test.js.map +1 -0
  58. package/dist/types/jwt-payload.d.ts +48 -0
  59. package/dist/types/jwt-payload.d.ts.map +1 -0
  60. package/dist/types/jwt-payload.js +3 -0
  61. package/dist/types/jwt-payload.js.map +1 -0
  62. package/dist/utils/redis.connection.d.ts +9 -0
  63. package/dist/utils/redis.connection.d.ts.map +1 -0
  64. package/dist/utils/redis.connection.js +27 -0
  65. package/dist/utils/redis.connection.js.map +1 -0
  66. package/package.json +99 -0
@@ -0,0 +1,9 @@
1
+ export * from './middlewares';
2
+ export * from './nestjs/jwt-auth.module';
3
+ export * from './nestjs/strategies/jwt-strategy';
4
+ export * from './nestjs/guards/jwt-guard';
5
+ export * from './nestjs/guards/project.guard';
6
+ export * from './nestjs/decorators/auth.decorator';
7
+ export * from './nestjs/decorators/current-user.decorator';
8
+ export * from './types/jwt-payload';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qBAAqB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./middlewares"), exports);
18
+ __exportStar(require("./nestjs/jwt-auth.module"), exports);
19
+ __exportStar(require("./nestjs/strategies/jwt-strategy"), exports);
20
+ __exportStar(require("./nestjs/guards/jwt-guard"), exports);
21
+ __exportStar(require("./nestjs/guards/project.guard"), exports);
22
+ __exportStar(require("./nestjs/decorators/auth.decorator"), exports);
23
+ __exportStar(require("./nestjs/decorators/current-user.decorator"), exports);
24
+ __exportStar(require("./types/jwt-payload"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,2DAAyC;AACzC,mEAAiD;AACjD,4DAA0C;AAC1C,gEAA6C;AAC7C,qEAAmD;AACnD,6EAA2D;AAC3D,sDAAmC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+ export declare function projectAuthMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
3
+ export declare function jwtAuthMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
4
+ //# sourceMappingURL=express.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.helper.d.ts","sourceRoot":"","sources":["../../src/middlewares/express.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK1D,wBAAgB,qBAAqB,KAGrB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAQ9D;AAED,wBAAgB,iBAAiB,KAGjB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAQ9D"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.projectAuthMiddleware = projectAuthMiddleware;
4
+ exports.jwtAuthMiddleware = jwtAuthMiddleware;
5
+ const project_guard_1 = require("./project.guard");
6
+ const jwt_guard_1 = require("./jwt.guard");
7
+ function projectAuthMiddleware() {
8
+ const authMiddleware = new project_guard_1.ProjectAuthMiddleware();
9
+ return async (req, res, next) => {
10
+ try {
11
+ await authMiddleware.authenticate(req);
12
+ next();
13
+ }
14
+ catch (error) {
15
+ res.status(401).json({ error: error.message });
16
+ }
17
+ };
18
+ }
19
+ function jwtAuthMiddleware() {
20
+ const authMiddleware = new jwt_guard_1.JwtAuthMiddleware();
21
+ return async (req, res, next) => {
22
+ try {
23
+ await authMiddleware.authenticate(req);
24
+ next();
25
+ }
26
+ catch (error) {
27
+ res.status(401).json({ error: error.message });
28
+ }
29
+ };
30
+ }
31
+ //# sourceMappingURL=express.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.helper.js","sourceRoot":"","sources":["../../src/middlewares/express.helper.ts"],"names":[],"mappings":";;AAKA,sDAWC;AAED,8CAWC;AA5BD,mDAAwD;AAExD,2CAAgD;AAEhD,SAAgB,qBAAqB;IACnC,MAAM,cAAc,GAAG,IAAI,qCAAqB,EAAE,CAAC;IAEnD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,YAAY,CAAC,GAA2B,CAAC,CAAC;YAC/D,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB;IAC/B,MAAM,cAAc,GAAG,IAAI,6BAAiB,EAAE,CAAC;IAE/C,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,YAAY,CAAC,GAA2B,CAAC,CAAC;YAC/D,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { GraphQLResolveInfo } from "graphql";
2
+ import { GqlContext } from "../types/jwt-payload";
3
+ export declare class GraphQLAuthHelper {
4
+ private projectAuth;
5
+ private jwtAuth;
6
+ authenticateJwt(context: GqlContext): Promise<void>;
7
+ withProjectAuth<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
8
+ withProjectAuthNoStrict<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
9
+ withJwtAuth<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
10
+ withJwtAuthNoStrict<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
11
+ withCombinedAuth<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
12
+ withCombinedAuthNoProjectStrict<TParent, TArgs, TResult>(resolver: (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult> | TResult): (parent: TParent, args: TArgs, context: GqlContext, info: GraphQLResolveInfo | null) => Promise<TResult>;
13
+ }
14
+ //# sourceMappingURL=gql.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql.helper.d.ts","sourceRoot":"","sources":["../../src/middlewares/gql.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKlD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,OAAO,CAA2B;IAEpC,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EACrC,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;IAOrB,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAC7C,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;IAYrB,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EACjC,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;IAOrB,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EACzC,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;IAarB,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EACtC,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;IAQrB,+BAA+B,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EACrD,QAAQ,EAAE,CACR,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAG7B,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,SAAS,UAAU,EACnB,MAAM,kBAAkB,GAAG,IAAI,KAC9B,OAAO,CAAC,OAAO,CAAC;CAetB"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphQLAuthHelper = void 0;
4
+ const jwt_guard_1 = require("./jwt.guard");
5
+ const project_guard_1 = require("./project.guard");
6
+ // GraphQL Middleware Helper (similar to your GqlMiddleware)
7
+ class GraphQLAuthHelper {
8
+ constructor() {
9
+ this.projectAuth = new project_guard_1.ProjectAuthMiddleware();
10
+ this.jwtAuth = new jwt_guard_1.JwtAuthMiddleware();
11
+ }
12
+ async authenticateJwt(context) {
13
+ if (!context.req) {
14
+ throw new Error('Request context not available');
15
+ }
16
+ await this.jwtAuth.authenticate(context.req);
17
+ }
18
+ withProjectAuth(resolver) {
19
+ return async (parent, args, context, info) => {
20
+ await this.projectAuth.authenticate(context.req);
21
+ return resolver(parent, args, context, info);
22
+ };
23
+ }
24
+ // No Strict: Project optional (no JWT check)
25
+ withProjectAuthNoStrict(resolver) {
26
+ return async (parent, args, context, info) => {
27
+ // Project auth is optional - continues if fails
28
+ try {
29
+ await this.projectAuth.authenticate(context.req);
30
+ }
31
+ catch (error) {
32
+ console.warn('Project auth (optional):', error.message);
33
+ }
34
+ return resolver(parent, args, context, info);
35
+ };
36
+ }
37
+ withJwtAuth(resolver) {
38
+ return async (parent, args, context, info) => {
39
+ await this.authenticateJwt(context);
40
+ return resolver(parent, args, context, info);
41
+ };
42
+ }
43
+ // No Strict: JWT optional (no project check)
44
+ withJwtAuthNoStrict(resolver) {
45
+ return async (parent, args, context, info) => {
46
+ // JWT auth is optional - continues if fails
47
+ try {
48
+ await this.authenticateJwt(context);
49
+ }
50
+ catch (error) {
51
+ // Optional: Log for debugging
52
+ console.warn('JWT auth (optional):', error.message);
53
+ }
54
+ return resolver(parent, args, context, info);
55
+ };
56
+ }
57
+ withCombinedAuth(resolver) {
58
+ return async (parent, args, context, info) => {
59
+ await this.authenticateJwt(context);
60
+ await this.projectAuth.authenticate(context.req);
61
+ return resolver(parent, args, context, info);
62
+ };
63
+ }
64
+ // No Strict: JWT required, Project optional
65
+ withCombinedAuthNoProjectStrict(resolver) {
66
+ return async (parent, args, context, info) => {
67
+ // JWT is required
68
+ await this.authenticateJwt(context);
69
+ // Project auth is optional - continues if fails
70
+ try {
71
+ await this.projectAuth.authenticate(context.req);
72
+ }
73
+ catch (error) {
74
+ // Optional: Log for debugging
75
+ console.warn('Project auth (optional):', error.message);
76
+ }
77
+ return resolver(parent, args, context, info);
78
+ };
79
+ }
80
+ }
81
+ exports.GraphQLAuthHelper = GraphQLAuthHelper;
82
+ //# sourceMappingURL=gql.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql.helper.js","sourceRoot":"","sources":["../../src/middlewares/gql.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ProjectAuthMiddleware } from "./project.guard";
2
+ export { JwtAuthMiddleware } from "./jwt.guard";
3
+ export { GraphQLAuthHelper } from "./gql.helper";
4
+ export { projectAuthMiddleware, jwtAuthMiddleware } from "./express.helper";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jwtAuthMiddleware = exports.projectAuthMiddleware = exports.GraphQLAuthHelper = exports.JwtAuthMiddleware = exports.ProjectAuthMiddleware = void 0;
4
+ var project_guard_1 = require("./project.guard");
5
+ Object.defineProperty(exports, "ProjectAuthMiddleware", { enumerable: true, get: function () { return project_guard_1.ProjectAuthMiddleware; } });
6
+ var jwt_guard_1 = require("./jwt.guard");
7
+ Object.defineProperty(exports, "JwtAuthMiddleware", { enumerable: true, get: function () { return jwt_guard_1.JwtAuthMiddleware; } });
8
+ var gql_helper_1 = require("./gql.helper");
9
+ Object.defineProperty(exports, "GraphQLAuthHelper", { enumerable: true, get: function () { return gql_helper_1.GraphQLAuthHelper; } });
10
+ var express_helper_1 = require("./express.helper");
11
+ Object.defineProperty(exports, "projectAuthMiddleware", { enumerable: true, get: function () { return express_helper_1.projectAuthMiddleware; } });
12
+ Object.defineProperty(exports, "jwtAuthMiddleware", { enumerable: true, get: function () { return express_helper_1.jwtAuthMiddleware; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;AAAA,iDAAuD;AAA9C,sHAAA,qBAAqB,OAAA;AAC9B,yCAA+C;AAAtC,8GAAA,iBAAiB,OAAA;AAC1B,2CAAgD;AAAvC,+GAAA,iBAAiB,OAAA;AAC1B,mDAA2E;AAAlE,uHAAA,qBAAqB,OAAA;AAAE,mHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,16 @@
1
+ import { AuthenticatedRequest } from '../types/jwt-payload';
2
+ export declare class JwtAuthMiddleware {
3
+ private expectedIssuer;
4
+ private jwksCache;
5
+ constructor();
6
+ authenticate(req: AuthenticatedRequest): Promise<void>;
7
+ private decodeJWTTokenForProjectUuid;
8
+ private getJwksUriAndPath;
9
+ private fetchJWKS;
10
+ private getSigningKey;
11
+ private createTokenCacheKey;
12
+ private cacheValidatedToken;
13
+ private getCachedToken;
14
+ private validate;
15
+ }
16
+ //# sourceMappingURL=jwt.guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.guard.d.ts","sourceRoot":"","sources":["../../src/middlewares/jwt.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AAQ9B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAGH;;IAOR,YAAY,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D,OAAO,CAAC,4BAA4B;IAuBpC,OAAO,CAAC,iBAAiB;YA2BX,SAAS;YAwET,aAAa;IA0D3B,OAAO,CAAC,mBAAmB;YAWb,mBAAmB;YAoBnB,cAAc;YAqCd,QAAQ;CA8EvB"}
@@ -0,0 +1,336 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.JwtAuthMiddleware = void 0;
40
+ const redis_connection_1 = __importDefault(require("../utils/redis.connection"));
41
+ const jsonwebtoken = __importStar(require("jsonwebtoken"));
42
+ const crypto = __importStar(require("crypto"));
43
+ const jose = __importStar(require("node-jose"));
44
+ const axios_1 = __importDefault(require("axios"));
45
+ // Advanced JWT Authentication with JWKS support
46
+ class JwtAuthMiddleware {
47
+ constructor() {
48
+ this.jwksCache = new Map();
49
+ const domain = process.env.MERCURY_BASE_URL || 'http://localhost:4000';
50
+ this.expectedIssuer = domain;
51
+ }
52
+ async authenticate(req) {
53
+ const authHeader = req.headers.authorization;
54
+ if (!authHeader) {
55
+ throw new Error('No authorization header provided');
56
+ }
57
+ const token = authHeader.startsWith('Bearer ')
58
+ ? authHeader.slice(7)
59
+ : authHeader;
60
+ if (!token) {
61
+ throw new Error('No token provided');
62
+ }
63
+ try {
64
+ // Get signing key from JWKS
65
+ const publicKey = await this.getSigningKey(token);
66
+ // Validate token
67
+ const user = await this.validate(token, publicKey);
68
+ req.user = user;
69
+ }
70
+ catch (error) {
71
+ throw new Error(`Invalid JWT token: ${error.message}`);
72
+ }
73
+ }
74
+ decodeJWTTokenForProjectUuid(rawJwtToken) {
75
+ try {
76
+ const parts = rawJwtToken.split('.');
77
+ if (parts.length !== 3) {
78
+ return null;
79
+ }
80
+ const decoded = jsonwebtoken.decode(rawJwtToken);
81
+ if (!decoded) {
82
+ return null;
83
+ }
84
+ if (typeof decoded === 'object' && decoded !== null && 'project_uuid' in decoded) {
85
+ const projectUuid = decoded.project_uuid || null;
86
+ return projectUuid;
87
+ }
88
+ return null;
89
+ }
90
+ catch (error) {
91
+ return null;
92
+ }
93
+ }
94
+ getJwksUriAndPath(projectUuid) {
95
+ const domain = process.env.MERCURY_BASE_URL || 'http://localhost:4000';
96
+ console.log('JWKS Debug - MERCURY_BASE_URL:', domain);
97
+ console.log('JWKS Debug - projectUuid:', projectUuid);
98
+ let path;
99
+ if (projectUuid) {
100
+ path = `auth/projects/${projectUuid}/.well-known/jwks.json`;
101
+ }
102
+ else {
103
+ const defaultProjectUuid = process.env.NEXUS_ID;
104
+ if (!defaultProjectUuid) {
105
+ throw new Error('No project UUID found in token and no default project UUID configured');
106
+ }
107
+ path = `auth/projects/${defaultProjectUuid}/.well-known/jwks.json`;
108
+ }
109
+ const uri = `${domain}/${path}`;
110
+ console.log('JWKS Debug - Constructed URI:', uri);
111
+ return { uri, path };
112
+ }
113
+ async fetchJWKS(jwksUri, path) {
114
+ try {
115
+ const timestamp = Date.now().toString();
116
+ const signatureInput = 'GET' + `/${path}` + timestamp;
117
+ const sharedSecret = process.env.SIGNATURE_SHARED_SECRET || '';
118
+ const signature = crypto
119
+ .createHmac('sha256', sharedSecret)
120
+ .update(signatureInput)
121
+ .digest('hex');
122
+ const headers = {
123
+ Accept: 'application/json',
124
+ 'User-Agent': 'Node-JWT-Strategy/1.0',
125
+ 'X-Timestamp': timestamp,
126
+ 'X-Signature': signature,
127
+ };
128
+ const response = await axios_1.default.get(jwksUri, {
129
+ timeout: 10000,
130
+ headers,
131
+ });
132
+ if (!response.data || !response.data.keys) {
133
+ throw new Error('Invalid JWKS response: missing keys');
134
+ }
135
+ let jwksData;
136
+ if (Array.isArray(response.data.keys)) {
137
+ jwksData = response.data;
138
+ }
139
+ else {
140
+ jwksData = {
141
+ keys: [response.data.keys],
142
+ };
143
+ }
144
+ const keyStore = await jose.JWK.asKeyStore(jwksData);
145
+ return keyStore;
146
+ }
147
+ catch (error) {
148
+ if (axios_1.default.isAxiosError(error)) {
149
+ const axiosError = error;
150
+ if (axiosError.code === 'ENOTFOUND') {
151
+ throw new Error('JWKS endpoint not reachable');
152
+ }
153
+ else if (axiosError.code === 'ETIMEDOUT') {
154
+ throw new Error('JWKS endpoint timeout');
155
+ }
156
+ else if (axiosError.code === 'CERT_REQUIRED' ||
157
+ axiosError.code === 'UNABLE_TO_GET_LOCAL_ISSUER_CERT') {
158
+ throw new Error('Client certificate authentication failed');
159
+ }
160
+ else if (axiosError.response?.status) {
161
+ throw new Error(`JWKS endpoint returned ${axiosError.response.status}: ${axiosError.response.statusText}`);
162
+ }
163
+ else {
164
+ const message = axiosError.message || 'Unknown error';
165
+ throw new Error(`Failed to fetch JWKS: ${message}`);
166
+ }
167
+ }
168
+ else {
169
+ const errorMessage = error instanceof Error ? error.message : String(error);
170
+ throw new Error(`Failed to fetch JWKS: ${errorMessage}`);
171
+ }
172
+ }
173
+ }
174
+ async getSigningKey(rawJwtToken) {
175
+ try {
176
+ const parts = rawJwtToken.split('.');
177
+ if (parts.length !== 3) {
178
+ throw new Error(`Invalid JWT format: expected 3 parts, got ${parts.length}`);
179
+ }
180
+ const headerBase64 = parts[0];
181
+ const headerJson = Buffer.from(headerBase64, 'base64').toString();
182
+ const header = JSON.parse(headerJson);
183
+ if (!header.kid) {
184
+ throw new Error('Missing key ID (kid) in token header');
185
+ }
186
+ const projectUuid = this.decodeJWTTokenForProjectUuid(rawJwtToken);
187
+ const { uri: jwksUri, path } = this.getJwksUriAndPath(projectUuid);
188
+ const cacheKey = projectUuid || 'default';
189
+ const cachedEntry = this.jwksCache.get(cacheKey);
190
+ let keyStore;
191
+ if (!cachedEntry || Date.now() > cachedEntry.expiry) {
192
+ keyStore = await this.fetchJWKS(jwksUri, path);
193
+ const expiryTime = Date.now() + 600000; // 10 minutes
194
+ this.jwksCache.set(cacheKey, {
195
+ keyStore: keyStore,
196
+ expiry: expiryTime,
197
+ });
198
+ }
199
+ else {
200
+ keyStore = cachedEntry.keyStore;
201
+ }
202
+ const key = keyStore.get(header.kid);
203
+ if (!key) {
204
+ throw new Error(`Key ${header.kid} not found in JWKS for project ${projectUuid || 'default'}`);
205
+ }
206
+ const publicKey = key.toPEM(false);
207
+ return publicKey;
208
+ }
209
+ catch (error) {
210
+ const errorMessage = error instanceof Error ? error.message : String(error);
211
+ throw new Error(`Unable to get signing key: ${errorMessage}`);
212
+ }
213
+ }
214
+ createTokenCacheKey(rawToken) {
215
+ const tokenHash = crypto
216
+ .createHash('sha256')
217
+ .update(rawToken)
218
+ .digest('hex')
219
+ .substring(0, 32);
220
+ const cacheKey = `validated_token:${tokenHash}`;
221
+ return cacheKey;
222
+ }
223
+ async cacheValidatedToken(payload, rawToken) {
224
+ try {
225
+ const redis = await redis_connection_1.default.getInstance();
226
+ const cacheExpiryTime = parseInt(process.env.CACHE_EXPIRY_TIME || '3600');
227
+ const cacheKey = this.createTokenCacheKey(rawToken);
228
+ const payloadString = JSON.stringify(payload);
229
+ await redis.set(cacheKey, payloadString, {
230
+ EX: cacheExpiryTime,
231
+ });
232
+ }
233
+ catch (error) {
234
+ console.warn('Failed to cache token:', error);
235
+ }
236
+ }
237
+ async getCachedToken(rawToken) {
238
+ try {
239
+ const redis = await redis_connection_1.default.getInstance();
240
+ const cacheKey = this.createTokenCacheKey(rawToken);
241
+ const cachedPayload = await redis.get(cacheKey);
242
+ if (cachedPayload && typeof cachedPayload === 'string') {
243
+ const payload = JSON.parse(cachedPayload);
244
+ // Validate cached payload structure
245
+ if (!payload.sub || !payload.sub.uuid || !payload.sub.email) {
246
+ await redis.del(cacheKey);
247
+ return null;
248
+ }
249
+ const now = Math.floor(Date.now() / 1000);
250
+ if (payload.exp && payload.exp < now) {
251
+ await redis.del(cacheKey);
252
+ return null;
253
+ }
254
+ return payload;
255
+ }
256
+ return null;
257
+ }
258
+ catch (error) {
259
+ try {
260
+ const cacheKey = this.createTokenCacheKey(rawToken);
261
+ const redis = await redis_connection_1.default.getInstance();
262
+ await redis.del(cacheKey);
263
+ }
264
+ catch (cleanupError) {
265
+ console.error('[JWT-DEBUG] Failed to cleanup corrupted cache entry:', cleanupError);
266
+ }
267
+ return null;
268
+ }
269
+ }
270
+ async validate(rawToken, publicKey) {
271
+ // Check cache first
272
+ const cachedPayload = await this.getCachedToken(rawToken);
273
+ if (cachedPayload) {
274
+ return {
275
+ uuid: cachedPayload.sub.uuid,
276
+ email: cachedPayload.sub.email,
277
+ name: cachedPayload.sub.name,
278
+ };
279
+ }
280
+ try {
281
+ // Verify the token using the public key
282
+ const verified = jsonwebtoken.verify(rawToken, publicKey, {
283
+ algorithms: ['RS512'],
284
+ ignoreExpiration: false,
285
+ });
286
+ if (typeof verified !== 'object' || verified === null) {
287
+ throw new Error('Invalid JWT payload');
288
+ }
289
+ const payload = verified;
290
+ // Validate the payload structure
291
+ if (!payload || !payload.sub || !payload.sub.uuid) {
292
+ throw new Error('Invalid JWT payload structure');
293
+ }
294
+ // Validate issuer
295
+ if (payload.iss !== this.expectedIssuer) {
296
+ throw new Error(`Invalid issuer. Expected: ${this.expectedIssuer}, Got: ${payload.iss}`);
297
+ }
298
+ // Validate timestamps
299
+ const now = Math.floor(Date.now() / 1000);
300
+ if (payload.exp && payload.exp < now) {
301
+ throw new Error('Token expired');
302
+ }
303
+ if (payload.nbf && payload.nbf > now) {
304
+ throw new Error('Token not yet valid');
305
+ }
306
+ // Check Redis for token revocation
307
+ if (payload.jti) {
308
+ try {
309
+ const redis = await redis_connection_1.default.getInstance();
310
+ const revocationKey = `revoked_token:${payload.jti}`;
311
+ const isRevoked = await redis.get(revocationKey);
312
+ if (isRevoked) {
313
+ throw new Error('Token has been revoked');
314
+ }
315
+ }
316
+ catch (error) {
317
+ const errorMessage = error instanceof Error ? error.message : String(error);
318
+ throw new Error(`Redis error: ${errorMessage}`);
319
+ }
320
+ }
321
+ // Cache the validated token
322
+ await this.cacheValidatedToken(payload, rawToken);
323
+ const authUser = {
324
+ uuid: payload.sub.uuid,
325
+ email: payload.sub.email,
326
+ name: payload.sub.name,
327
+ };
328
+ return authUser;
329
+ }
330
+ catch (error) {
331
+ throw new Error(`Token validation failed: ${error.message}`);
332
+ }
333
+ }
334
+ }
335
+ exports.JwtAuthMiddleware = JwtAuthMiddleware;
336
+ //# sourceMappingURL=jwt.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.guard.js","sourceRoot":"","sources":["../../src/middlewares/jwt.guard.ts"],"names":[],"mappings":"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"}