@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.
- package/README.md +986 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/express.helper.d.ts +4 -0
- package/dist/middlewares/express.helper.d.ts.map +1 -0
- package/dist/middlewares/express.helper.js +31 -0
- package/dist/middlewares/express.helper.js.map +1 -0
- package/dist/middlewares/gql.helper.d.ts +14 -0
- package/dist/middlewares/gql.helper.d.ts.map +1 -0
- package/dist/middlewares/gql.helper.js +82 -0
- package/dist/middlewares/gql.helper.js.map +1 -0
- package/dist/middlewares/index.d.ts +5 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +13 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/jwt.guard.d.ts +16 -0
- package/dist/middlewares/jwt.guard.d.ts.map +1 -0
- package/dist/middlewares/jwt.guard.js +336 -0
- package/dist/middlewares/jwt.guard.js.map +1 -0
- package/dist/middlewares/project.guard.d.ts +49 -0
- package/dist/middlewares/project.guard.d.ts.map +1 -0
- package/dist/middlewares/project.guard.js +310 -0
- package/dist/middlewares/project.guard.js.map +1 -0
- package/dist/nestjs/decorators/auth.decorator.d.ts +2 -0
- package/dist/nestjs/decorators/auth.decorator.d.ts.map +1 -0
- package/dist/nestjs/decorators/auth.decorator.js +10 -0
- package/dist/nestjs/decorators/auth.decorator.js.map +1 -0
- package/dist/nestjs/decorators/current-user.decorator.d.ts +2 -0
- package/dist/nestjs/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/nestjs/decorators/current-user.decorator.js +18 -0
- package/dist/nestjs/decorators/current-user.decorator.js.map +1 -0
- package/dist/nestjs/guards/jwt-guard.d.ts +8 -0
- package/dist/nestjs/guards/jwt-guard.d.ts.map +1 -0
- package/dist/nestjs/guards/jwt-guard.js +23 -0
- package/dist/nestjs/guards/jwt-guard.js.map +1 -0
- package/dist/nestjs/guards/project.guard.d.ts +45 -0
- package/dist/nestjs/guards/project.guard.d.ts.map +1 -0
- package/dist/nestjs/guards/project.guard.js +352 -0
- package/dist/nestjs/guards/project.guard.js.map +1 -0
- package/dist/nestjs/index.d.ts +6 -0
- package/dist/nestjs/index.d.ts.map +1 -0
- package/dist/nestjs/index.js +14 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/nestjs/jwt-auth.module.d.ts +3 -0
- package/dist/nestjs/jwt-auth.module.d.ts.map +1 -0
- package/dist/nestjs/jwt-auth.module.js +25 -0
- package/dist/nestjs/jwt-auth.module.js.map +1 -0
- package/dist/nestjs/strategies/jwt-strategy.d.ts +23 -0
- package/dist/nestjs/strategies/jwt-strategy.d.ts.map +1 -0
- package/dist/nestjs/strategies/jwt-strategy.js +381 -0
- package/dist/nestjs/strategies/jwt-strategy.js.map +1 -0
- package/dist/test/middleware.test.d.ts +2 -0
- package/dist/test/middleware.test.d.ts.map +1 -0
- package/dist/test/middleware.test.js +383 -0
- package/dist/test/middleware.test.js.map +1 -0
- package/dist/types/jwt-payload.d.ts +48 -0
- package/dist/types/jwt-payload.d.ts.map +1 -0
- package/dist/types/jwt-payload.js +3 -0
- package/dist/types/jwt-payload.js.map +1 -0
- package/dist/utils/redis.connection.d.ts +9 -0
- package/dist/utils/redis.connection.d.ts.map +1 -0
- package/dist/utils/redis.connection.js +27 -0
- package/dist/utils/redis.connection.js.map +1 -0
- package/package.json +99 -0
package/dist/index.d.ts
ADDED
|
@@ -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":";;;AAEA,2CAAgD;AAChD,mDAAwD;AAExD,4DAA4D;AAC5D,MAAa,iBAAiB;IAA9B;QACU,gBAAW,GAAG,IAAI,qCAAqB,EAAE,CAAC;QAC1C,YAAO,GAAG,IAAI,6BAAiB,EAAE,CAAC;IAqJ5C,CAAC;IAnJC,KAAK,CAAC,eAAe,CAAC,OAAmB;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe,CACb,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,uBAAuB,CACrB,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,gDAAgD;YAChD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,WAAW,CACT,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,mBAAmB,CACjB,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,4CAA4C;YAC5C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8BAA8B;gBAC9B,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,gBAAgB,CACd,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,+BAA+B,CAC7B,QAK+B;QAE/B,OAAO,KAAK,EACV,MAAe,EACf,IAAW,EACX,OAAmB,EACnB,IAA+B,EACb,EAAE;YACpB,kBAAkB;YAClB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAEpC,gDAAgD;YAChD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8BAA8B;gBAC9B,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;CACF;AAvJD,8CAuJC"}
|
|
@@ -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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"}
|