@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.
- package/README.md +372 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +110 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/extract-user.d.ts +10 -0
- package/dist/extract-user.d.ts.map +1 -0
- package/dist/extract-user.js +30 -0
- package/dist/extract-user.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/authenticate.d.ts +10 -0
- package/dist/middlewares/authenticate.d.ts.map +1 -0
- package/dist/middlewares/authenticate.js +26 -0
- package/dist/middlewares/authenticate.js.map +1 -0
- package/dist/middlewares/error-handler.d.ts +12 -0
- package/dist/middlewares/error-handler.d.ts.map +1 -0
- package/dist/middlewares/error-handler.js +22 -0
- package/dist/middlewares/error-handler.js.map +1 -0
- package/dist/middlewares/require-permission.d.ts +12 -0
- package/dist/middlewares/require-permission.d.ts.map +1 -0
- package/dist/middlewares/require-permission.js +63 -0
- package/dist/middlewares/require-permission.js.map +1 -0
- package/dist/middlewares/require-role.d.ts +12 -0
- package/dist/middlewares/require-role.d.ts.map +1 -0
- package/dist/middlewares/require-role.js +30 -0
- package/dist/middlewares/require-role.js.map +1 -0
- package/dist/middlewares/require-self.d.ts +10 -0
- package/dist/middlewares/require-self.d.ts.map +1 -0
- package/dist/middlewares/require-self.js +40 -0
- package/dist/middlewares/require-self.js.map +1 -0
- package/dist/middlewares/require-tenant.d.ts +11 -0
- package/dist/middlewares/require-tenant.d.ts.map +1 -0
- package/dist/middlewares/require-tenant.js +25 -0
- package/dist/middlewares/require-tenant.js.map +1 -0
- package/dist/nestjs/constants.d.ts +5 -0
- package/dist/nestjs/constants.d.ts.map +1 -0
- package/dist/nestjs/constants.js +8 -0
- package/dist/nestjs/constants.js.map +1 -0
- package/dist/nestjs/decorators/index.d.ts +44 -0
- package/dist/nestjs/decorators/index.d.ts.map +1 -0
- package/dist/nestjs/decorators/index.js +61 -0
- package/dist/nestjs/decorators/index.js.map +1 -0
- package/dist/nestjs/filters/auth-exception.filter.d.ts +16 -0
- package/dist/nestjs/filters/auth-exception.filter.d.ts.map +1 -0
- package/dist/nestjs/filters/auth-exception.filter.js +37 -0
- package/dist/nestjs/filters/auth-exception.filter.js.map +1 -0
- package/dist/nestjs/gt-auth.module.d.ts +31 -0
- package/dist/nestjs/gt-auth.module.d.ts.map +1 -0
- package/dist/nestjs/gt-auth.module.js +102 -0
- package/dist/nestjs/gt-auth.module.js.map +1 -0
- package/dist/nestjs/guards/auth.guard.d.ts +13 -0
- package/dist/nestjs/guards/auth.guard.d.ts.map +1 -0
- package/dist/nestjs/guards/auth.guard.js +53 -0
- package/dist/nestjs/guards/auth.guard.js.map +1 -0
- package/dist/nestjs/guards/internal-only.guard.d.ts +15 -0
- package/dist/nestjs/guards/internal-only.guard.d.ts.map +1 -0
- package/dist/nestjs/guards/internal-only.guard.js +51 -0
- package/dist/nestjs/guards/internal-only.guard.js.map +1 -0
- package/dist/nestjs/guards/permissions.guard.d.ts +23 -0
- package/dist/nestjs/guards/permissions.guard.d.ts.map +1 -0
- package/dist/nestjs/guards/permissions.guard.js +134 -0
- package/dist/nestjs/guards/permissions.guard.js.map +1 -0
- package/dist/nestjs/index.d.ts +12 -0
- package/dist/nestjs/index.d.ts.map +1 -0
- package/dist/nestjs/index.js +40 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/nestjs/interceptors/org-context.interceptor.d.ts +21 -0
- package/dist/nestjs/interceptors/org-context.interceptor.d.ts.map +1 -0
- package/dist/nestjs/interceptors/org-context.interceptor.js +63 -0
- package/dist/nestjs/interceptors/org-context.interceptor.js.map +1 -0
- package/dist/nestjs/middleware/trusted-headers.middleware.d.ts +15 -0
- package/dist/nestjs/middleware/trusted-headers.middleware.d.ts.map +1 -0
- package/dist/nestjs/middleware/trusted-headers.middleware.js +42 -0
- package/dist/nestjs/middleware/trusted-headers.middleware.js.map +1 -0
- package/dist/nestjs.d.ts +2 -0
- package/dist/nestjs.d.ts.map +1 -0
- package/dist/nestjs.js +18 -0
- package/dist/nestjs.js.map +1 -0
- package/dist/strategies/gateway-header.strategy.d.ts +13 -0
- package/dist/strategies/gateway-header.strategy.d.ts.map +1 -0
- package/dist/strategies/gateway-header.strategy.js +51 -0
- package/dist/strategies/gateway-header.strategy.js.map +1 -0
- package/dist/strategies/index.d.ts +5 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +10 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/jwt.strategy.d.ts +13 -0
- package/dist/strategies/jwt.strategy.d.ts.map +1 -0
- package/dist/strategies/jwt.strategy.js +94 -0
- package/dist/strategies/jwt.strategy.js.map +1 -0
- package/dist/strategies/strategy.interface.d.ts +15 -0
- package/dist/strategies/strategy.interface.d.ts.map +1 -0
- package/dist/strategies/strategy.interface.js +3 -0
- package/dist/strategies/strategy.interface.js.map +1 -0
- package/dist/strategies/trusted-headers.strategy.d.ts +16 -0
- package/dist/strategies/trusted-headers.strategy.d.ts.map +1 -0
- package/dist/strategies/trusted-headers.strategy.js +50 -0
- package/dist/strategies/trusted-headers.strategy.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/helpers.d.ts +14 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +26 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/jwt.d.ts +12 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +104 -0
- package/dist/utils/jwt.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,42 @@
|
|
|
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.GtTrustedHeadersMiddleware = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const extract_user_1 = require("../../extract-user");
|
|
12
|
+
const errors_1 = require("../../errors");
|
|
13
|
+
/**
|
|
14
|
+
* NestJS middleware that wraps the core extractUser() function.
|
|
15
|
+
* Sets req.user and req.tenantId from the configured strategy chain.
|
|
16
|
+
*
|
|
17
|
+
* Register in your module's configure():
|
|
18
|
+
* ```
|
|
19
|
+
* consumer.apply(GtTrustedHeadersMiddleware).forRoutes('*');
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
let GtTrustedHeadersMiddleware = class GtTrustedHeadersMiddleware {
|
|
23
|
+
use(req, _res, next) {
|
|
24
|
+
try {
|
|
25
|
+
req.user = (0, extract_user_1.extractUser)(req);
|
|
26
|
+
req.tenantId = req.user.orgId;
|
|
27
|
+
next();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err instanceof errors_1.UnauthorizedError) {
|
|
31
|
+
next(err);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
next(err);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.GtTrustedHeadersMiddleware = GtTrustedHeadersMiddleware;
|
|
39
|
+
exports.GtTrustedHeadersMiddleware = GtTrustedHeadersMiddleware = __decorate([
|
|
40
|
+
(0, common_1.Injectable)()
|
|
41
|
+
], GtTrustedHeadersMiddleware);
|
|
42
|
+
//# sourceMappingURL=trusted-headers.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-headers.middleware.js","sourceRoot":"","sources":["../../../src/nestjs/middleware/trusted-headers.middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4D;AAE5D,qDAAiD;AACjD,yCAAiD;AAEjD;;;;;;;;GAQG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IACrC,GAAG,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB;QAClD,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,GAAG,IAAA,0BAAW,EAAC,GAAG,CAAC,CAAC;YAC5B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9B,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,0BAAiB,EAAE,CAAC;gBACrC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAA;AAdY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,mBAAU,GAAE;GACA,0BAA0B,CActC"}
|
package/dist/nestjs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../src/nestjs.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
package/dist/nestjs.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
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("./nestjs/index"), exports);
|
|
18
|
+
//# sourceMappingURL=nestjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../src/nestjs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { AuthUser } from '../types';
|
|
3
|
+
import { AuthExtractionStrategy } from './strategy.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Extracts user from GCP API Gateway's base64-encoded JSON header.
|
|
6
|
+
* The gateway has already verified the JWT — we just parse the claims.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GatewayHeaderStrategy implements AuthExtractionStrategy {
|
|
9
|
+
readonly name = "gateway-header";
|
|
10
|
+
canHandle(req: Request): boolean;
|
|
11
|
+
extract(req: Request): AuthUser;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=gateway-header.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-header.strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/gateway-header.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAc,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,QAAQ,CAAC,IAAI,oBAAoB;IAEjC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAKhC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ;CAiChC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GatewayHeaderStrategy = void 0;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
/**
|
|
7
|
+
* Extracts user from GCP API Gateway's base64-encoded JSON header.
|
|
8
|
+
* The gateway has already verified the JWT — we just parse the claims.
|
|
9
|
+
*/
|
|
10
|
+
class GatewayHeaderStrategy {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.name = 'gateway-header';
|
|
13
|
+
}
|
|
14
|
+
canHandle(req) {
|
|
15
|
+
const config = (0, config_1.getConfig)();
|
|
16
|
+
return !!req.headers[config.gatewayHeaderName];
|
|
17
|
+
}
|
|
18
|
+
extract(req) {
|
|
19
|
+
const config = (0, config_1.getConfig)();
|
|
20
|
+
const headerValue = req.headers[config.gatewayHeaderName];
|
|
21
|
+
let decoded;
|
|
22
|
+
try {
|
|
23
|
+
decoded = Buffer.from(headerValue, 'base64').toString('utf-8');
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new errors_1.UnauthorizedError('Invalid gateway header encoding');
|
|
27
|
+
}
|
|
28
|
+
let payload;
|
|
29
|
+
try {
|
|
30
|
+
payload = JSON.parse(decoded);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new errors_1.UnauthorizedError('Invalid gateway header JSON');
|
|
34
|
+
}
|
|
35
|
+
if (!payload.sub) {
|
|
36
|
+
throw new errors_1.UnauthorizedError('Token missing required claim: sub');
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
userId: payload.sub,
|
|
40
|
+
email: payload.email || '',
|
|
41
|
+
role: payload.role || '',
|
|
42
|
+
orgId: payload.org_id || '',
|
|
43
|
+
tenantId: payload.tenant_id || payload.org_id || '',
|
|
44
|
+
permissions: Array.isArray(payload.permissions) ? payload.permissions : [],
|
|
45
|
+
requestId: req.headers['x-request-id'] || '',
|
|
46
|
+
authSource: 'gateway-header',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.GatewayHeaderStrategy = GatewayHeaderStrategy;
|
|
51
|
+
//# sourceMappingURL=gateway-header.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-header.strategy.js","sourceRoot":"","sources":["../../src/strategies/gateway-header.strategy.ts"],"names":[],"mappings":";;;AACA,sCAAsC;AAEtC,sCAA8C;AAG9C;;;GAGG;AACH,MAAa,qBAAqB;IAAlC;QACW,SAAI,GAAG,gBAAgB,CAAC;IAwCnC,CAAC;IAtCC,SAAS,CAAC,GAAY;QACpB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAY;QAClB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAW,CAAC;QAEpE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,0BAAiB,CAAC,iCAAiC,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,0BAAiB,CAAC,6BAA6B,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,0BAAiB,CAAC,mCAAmC,CAAC,CAAC;QACnE,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,GAAG;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC3B,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;YACnD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAC1E,SAAS,EAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAY,IAAI,EAAE;YACxD,UAAU,EAAE,gBAAgB;SAC7B,CAAC;IACJ,CAAC;CACF;AAzCD,sDAyCC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AuthExtractionStrategy } from './strategy.interface';
|
|
2
|
+
export { GatewayHeaderStrategy } from './gateway-header.strategy';
|
|
3
|
+
export { TrustedHeadersStrategy } from './trusted-headers.strategy';
|
|
4
|
+
export { JwtStrategy } from './jwt.strategy';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JwtStrategy = exports.TrustedHeadersStrategy = exports.GatewayHeaderStrategy = void 0;
|
|
4
|
+
var gateway_header_strategy_1 = require("./gateway-header.strategy");
|
|
5
|
+
Object.defineProperty(exports, "GatewayHeaderStrategy", { enumerable: true, get: function () { return gateway_header_strategy_1.GatewayHeaderStrategy; } });
|
|
6
|
+
var trusted_headers_strategy_1 = require("./trusted-headers.strategy");
|
|
7
|
+
Object.defineProperty(exports, "TrustedHeadersStrategy", { enumerable: true, get: function () { return trusted_headers_strategy_1.TrustedHeadersStrategy; } });
|
|
8
|
+
var jwt_strategy_1 = require("./jwt.strategy");
|
|
9
|
+
Object.defineProperty(exports, "JwtStrategy", { enumerable: true, get: function () { return jwt_strategy_1.JwtStrategy; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":";;;AACA,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { AuthUser } from '../types';
|
|
3
|
+
import { AuthExtractionStrategy } from './strategy.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Extracts user by verifying an RS256 JWT from the Authorization: Bearer header.
|
|
6
|
+
* Used in local dev or non-gateway environments.
|
|
7
|
+
*/
|
|
8
|
+
export declare class JwtStrategy implements AuthExtractionStrategy {
|
|
9
|
+
readonly name = "jwt";
|
|
10
|
+
canHandle(req: Request): boolean;
|
|
11
|
+
extract(req: Request): AuthUser;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=jwt.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/jwt.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAc,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;GAGG;AACH,qBAAa,WAAY,YAAW,sBAAsB;IACxD,QAAQ,CAAC,IAAI,SAAS;IAEtB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAIhC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ;CA8ChC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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.JwtStrategy = void 0;
|
|
37
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
38
|
+
const config_1 = require("../config");
|
|
39
|
+
const errors_1 = require("../errors");
|
|
40
|
+
/**
|
|
41
|
+
* Extracts user by verifying an RS256 JWT from the Authorization: Bearer header.
|
|
42
|
+
* Used in local dev or non-gateway environments.
|
|
43
|
+
*/
|
|
44
|
+
class JwtStrategy {
|
|
45
|
+
constructor() {
|
|
46
|
+
this.name = 'jwt';
|
|
47
|
+
}
|
|
48
|
+
canHandle(req) {
|
|
49
|
+
return !!req.headers.authorization;
|
|
50
|
+
}
|
|
51
|
+
extract(req) {
|
|
52
|
+
const config = (0, config_1.getConfig)();
|
|
53
|
+
const authHeader = req.headers.authorization;
|
|
54
|
+
const parts = authHeader.split(' ');
|
|
55
|
+
if (parts.length !== 2 || parts[0] !== 'Bearer') {
|
|
56
|
+
throw new errors_1.UnauthorizedError('Invalid Authorization header format — expected "Bearer <token>"');
|
|
57
|
+
}
|
|
58
|
+
const token = parts[1];
|
|
59
|
+
if (!config.publicKey) {
|
|
60
|
+
throw new errors_1.UnauthorizedError('JWT verification not configured — no public key available');
|
|
61
|
+
}
|
|
62
|
+
let decoded;
|
|
63
|
+
try {
|
|
64
|
+
decoded = jwt.verify(token, config.publicKey, {
|
|
65
|
+
algorithms: ['RS256'],
|
|
66
|
+
issuer: config.jwtIssuer || undefined,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (err instanceof jwt.TokenExpiredError) {
|
|
71
|
+
throw new errors_1.UnauthorizedError('Token has expired');
|
|
72
|
+
}
|
|
73
|
+
if (err instanceof jwt.JsonWebTokenError) {
|
|
74
|
+
throw new errors_1.UnauthorizedError(`Invalid token: ${err.message}`);
|
|
75
|
+
}
|
|
76
|
+
throw new errors_1.UnauthorizedError('Token verification failed');
|
|
77
|
+
}
|
|
78
|
+
if (!decoded.sub) {
|
|
79
|
+
throw new errors_1.UnauthorizedError('Token missing required claim: sub');
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
userId: decoded.sub,
|
|
83
|
+
email: decoded.email || '',
|
|
84
|
+
role: decoded.role || '',
|
|
85
|
+
orgId: decoded.org_id || '',
|
|
86
|
+
tenantId: decoded.tenant_id || decoded.org_id || '',
|
|
87
|
+
permissions: Array.isArray(decoded.permissions) ? decoded.permissions : [],
|
|
88
|
+
requestId: req.headers['x-request-id'] || '',
|
|
89
|
+
authSource: 'jwt',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.JwtStrategy = JwtStrategy;
|
|
94
|
+
//# sourceMappingURL=jwt.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../src/strategies/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAoC;AAEpC,sCAAsC;AAEtC,sCAA8C;AAG9C;;;GAGG;AACH,MAAa,WAAW;IAAxB;QACW,SAAI,GAAG,KAAK,CAAC;IAoDxB,CAAC;IAlDC,SAAS,CAAC,GAAY;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,GAAY;QAClB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAc,CAAC;QAE9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,0BAAiB,CAAC,iEAAiE,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,0BAAiB,CAAC,2DAA2D,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC5C,UAAU,EAAE,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;aACtC,CAAe,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACzC,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,GAAG,YAAY,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACzC,MAAM,IAAI,0BAAiB,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,IAAI,0BAAiB,CAAC,2BAA2B,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,0BAAiB,CAAC,mCAAmC,CAAC,CAAC;QACnE,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,GAAG;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC3B,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;YACnD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAC1E,SAAS,EAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAY,IAAI,EAAE;YACxD,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;CACF;AArDD,kCAqDC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { AuthUser } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Interface for auth extraction strategies.
|
|
5
|
+
* Each strategy knows how to detect and extract user context from a request.
|
|
6
|
+
*/
|
|
7
|
+
export interface AuthExtractionStrategy {
|
|
8
|
+
/** Strategy identifier matching AuthStrategy type */
|
|
9
|
+
readonly name: string;
|
|
10
|
+
/** Returns true if this strategy can handle the given request (i.e., the relevant headers exist) */
|
|
11
|
+
canHandle(req: Request): boolean;
|
|
12
|
+
/** Extract AuthUser from the request. Throws UnauthorizedError on invalid credentials. */
|
|
13
|
+
extract(req: Request): AuthUser;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=strategy.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.interface.d.ts","sourceRoot":"","sources":["../../src/strategies/strategy.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,oGAAoG;IACpG,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjC,0FAA0F;IAC1F,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.interface.js","sourceRoot":"","sources":["../../src/strategies/strategy.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { AuthUser } from '../types';
|
|
3
|
+
import { AuthExtractionStrategy } from './strategy.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Extracts user from trusted headers set by an API Gateway or reverse proxy.
|
|
6
|
+
* Headers: X-User-Id, X-Org-Id, X-User-Role, X-Request-Id, X-Gateway-Token.
|
|
7
|
+
*
|
|
8
|
+
* If `internalGatewayToken` is configured, the request must include a matching
|
|
9
|
+
* gateway token header to prove it came through the trusted gateway.
|
|
10
|
+
*/
|
|
11
|
+
export declare class TrustedHeadersStrategy implements AuthExtractionStrategy {
|
|
12
|
+
readonly name = "trusted-headers";
|
|
13
|
+
canHandle(req: Request): boolean;
|
|
14
|
+
extract(req: Request): AuthUser;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=trusted-headers.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-headers.strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/trusted-headers.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,sBAAsB;IACnE,QAAQ,CAAC,IAAI,qBAAqB;IAElC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAMhC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ;CA8BhC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TrustedHeadersStrategy = void 0;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
/**
|
|
7
|
+
* Extracts user from trusted headers set by an API Gateway or reverse proxy.
|
|
8
|
+
* Headers: X-User-Id, X-Org-Id, X-User-Role, X-Request-Id, X-Gateway-Token.
|
|
9
|
+
*
|
|
10
|
+
* If `internalGatewayToken` is configured, the request must include a matching
|
|
11
|
+
* gateway token header to prove it came through the trusted gateway.
|
|
12
|
+
*/
|
|
13
|
+
class TrustedHeadersStrategy {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.name = 'trusted-headers';
|
|
16
|
+
}
|
|
17
|
+
canHandle(req) {
|
|
18
|
+
const config = (0, config_1.getConfig)();
|
|
19
|
+
const headerNames = config.trustedHeaderNames;
|
|
20
|
+
return !!req.headers[headerNames.userId];
|
|
21
|
+
}
|
|
22
|
+
extract(req) {
|
|
23
|
+
const config = (0, config_1.getConfig)();
|
|
24
|
+
const headerNames = config.trustedHeaderNames;
|
|
25
|
+
const userId = req.headers[headerNames.userId];
|
|
26
|
+
if (!userId) {
|
|
27
|
+
throw new errors_1.UnauthorizedError('Missing required trusted header: user ID');
|
|
28
|
+
}
|
|
29
|
+
// Validate gateway token if configured
|
|
30
|
+
if (config.internalGatewayToken) {
|
|
31
|
+
const gatewayToken = req.headers[headerNames.gatewayToken];
|
|
32
|
+
if (gatewayToken !== config.internalGatewayToken) {
|
|
33
|
+
throw new errors_1.UnauthorizedError('Invalid or missing gateway token');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const orgId = req.headers[headerNames.orgId] || '';
|
|
37
|
+
return {
|
|
38
|
+
userId,
|
|
39
|
+
email: '',
|
|
40
|
+
role: req.headers[headerNames.userRole] || '',
|
|
41
|
+
orgId,
|
|
42
|
+
tenantId: orgId,
|
|
43
|
+
permissions: [],
|
|
44
|
+
requestId: req.headers[headerNames.requestId] || '',
|
|
45
|
+
authSource: 'trusted-headers',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.TrustedHeadersStrategy = TrustedHeadersStrategy;
|
|
50
|
+
//# sourceMappingURL=trusted-headers.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-headers.strategy.js","sourceRoot":"","sources":["../../src/strategies/trusted-headers.strategy.ts"],"names":[],"mappings":";;;AACA,sCAAsC;AAEtC,sCAA8C;AAG9C;;;;;;GAMG;AACH,MAAa,sBAAsB;IAAnC;QACW,SAAI,GAAG,iBAAiB,CAAC;IAsCpC,CAAC;IApCC,SAAS,CAAC,GAAY;QACpB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC9C,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAY;QAClB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAE9C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAuB,CAAC;QACrE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,0BAAiB,CAAC,0CAA0C,CAAC,CAAC;QAC1E,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAuB,CAAC;YACjF,IAAI,YAAY,KAAK,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAiB,CAAC,kCAAkC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAY,IAAI,EAAE,CAAC;QAE/D,OAAO;YACL,MAAM;YACN,KAAK,EAAE,EAAE;YACT,IAAI,EAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAY,IAAI,EAAE;YACzD,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,EAAE;YACf,SAAS,EAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAY,IAAI,EAAE;YAC/D,UAAU,EAAE,iBAAiB;SAC9B,CAAC;IACJ,CAAC;CACF;AAvCD,wDAuCC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type AuthStrategy = 'gateway-header' | 'trusted-headers' | 'jwt';
|
|
2
|
+
export type UserRole = 'system_admin' | 'org_admin' | 'user' | (string & {});
|
|
3
|
+
export interface AuthUser {
|
|
4
|
+
userId: string;
|
|
5
|
+
email: string;
|
|
6
|
+
role: UserRole;
|
|
7
|
+
orgId: string;
|
|
8
|
+
tenantId: string;
|
|
9
|
+
permissions: string[];
|
|
10
|
+
requestId: string;
|
|
11
|
+
authSource: AuthStrategy;
|
|
12
|
+
}
|
|
13
|
+
/** Backward-compatible alias for services migrating from RequestUser */
|
|
14
|
+
export type RequestUser = AuthUser;
|
|
15
|
+
export interface TrustedHeaderNames {
|
|
16
|
+
userId?: string;
|
|
17
|
+
orgId?: string;
|
|
18
|
+
userRole?: string;
|
|
19
|
+
requestId?: string;
|
|
20
|
+
gatewayToken?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AuthConfig {
|
|
23
|
+
/** Header name for gateway-decoded user info. Default: 'x-apigateway-api-userinfo' */
|
|
24
|
+
gatewayHeaderName?: string;
|
|
25
|
+
/** Expected JWT issuer for fallback verification. Default: 'globaltracking-auth' */
|
|
26
|
+
jwtIssuer?: string;
|
|
27
|
+
/** RS256 public key PEM string for fallback JWT verification */
|
|
28
|
+
publicKey?: string;
|
|
29
|
+
/** Path to RS256 public key file (alternative to publicKey) */
|
|
30
|
+
publicKeyPath?: string;
|
|
31
|
+
/** @deprecated Use adminRoles instead. Kept for backward compat. */
|
|
32
|
+
superAdminRole?: string;
|
|
33
|
+
/** Ordered list of strategies to try. Default: ['gateway-header', 'jwt'] */
|
|
34
|
+
strategies?: AuthStrategy[];
|
|
35
|
+
/** Roles that bypass all permission checks. Default: ['system_admin', 'org_admin'] */
|
|
36
|
+
adminRoles?: string[];
|
|
37
|
+
/** Shared secret for InternalOnlyGuard. Also reads from env INTERNAL_GATEWAY_TOKEN */
|
|
38
|
+
internalGatewayToken?: string;
|
|
39
|
+
/** Header names for trusted-headers strategy */
|
|
40
|
+
trustedHeaderNames?: TrustedHeaderNames;
|
|
41
|
+
/** URL to gt-rbac-service for DB-based permission resolution */
|
|
42
|
+
rbacServiceUrl?: string;
|
|
43
|
+
/** Custom permission resolver function (used by RBAC service itself) */
|
|
44
|
+
permissionResolver?: (orgId: string, userId: string, resource: string, action: string) => Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
export interface JwtPayload {
|
|
47
|
+
sub: string;
|
|
48
|
+
email: string;
|
|
49
|
+
role: string;
|
|
50
|
+
tenant_id: string;
|
|
51
|
+
org_id: string;
|
|
52
|
+
permissions: string[];
|
|
53
|
+
iss?: string;
|
|
54
|
+
exp?: number;
|
|
55
|
+
iat?: number;
|
|
56
|
+
}
|
|
57
|
+
/** Resolved config with all defaults applied */
|
|
58
|
+
export interface ResolvedAuthConfig {
|
|
59
|
+
gatewayHeaderName: string;
|
|
60
|
+
jwtIssuer: string;
|
|
61
|
+
publicKey: string;
|
|
62
|
+
publicKeyPath: string;
|
|
63
|
+
strategies: AuthStrategy[];
|
|
64
|
+
adminRoles: string[];
|
|
65
|
+
internalGatewayToken: string;
|
|
66
|
+
trustedHeaderNames: Required<TrustedHeaderNames>;
|
|
67
|
+
rbacServiceUrl: string;
|
|
68
|
+
permissionResolver?: (orgId: string, userId: string, resource: string, action: string) => Promise<boolean>;
|
|
69
|
+
}
|
|
70
|
+
declare global {
|
|
71
|
+
namespace Express {
|
|
72
|
+
interface Request {
|
|
73
|
+
user?: AuthUser;
|
|
74
|
+
tenantId?: string;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthUser } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a user has one of the specified roles.
|
|
4
|
+
*/
|
|
5
|
+
export declare function hasRole(user: AuthUser, ...roles: string[]): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a user has ALL of the specified permissions.
|
|
8
|
+
*/
|
|
9
|
+
export declare function hasPermission(user: AuthUser, ...permissions: string[]): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a user has AT LEAST ONE of the specified permissions.
|
|
12
|
+
*/
|
|
13
|
+
export declare function hasAnyPermission(user: AuthUser, ...permissions: string[]): boolean;
|
|
14
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAG/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasRole = hasRole;
|
|
4
|
+
exports.hasPermission = hasPermission;
|
|
5
|
+
exports.hasAnyPermission = hasAnyPermission;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a user has one of the specified roles.
|
|
8
|
+
*/
|
|
9
|
+
function hasRole(user, ...roles) {
|
|
10
|
+
return roles.includes(user.role);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if a user has ALL of the specified permissions.
|
|
14
|
+
*/
|
|
15
|
+
function hasPermission(user, ...permissions) {
|
|
16
|
+
const userPerms = new Set(user.permissions);
|
|
17
|
+
return permissions.every((p) => userPerms.has(p));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a user has AT LEAST ONE of the specified permissions.
|
|
21
|
+
*/
|
|
22
|
+
function hasAnyPermission(user, ...permissions) {
|
|
23
|
+
const userPerms = new Set(user.permissions);
|
|
24
|
+
return permissions.some((p) => userPerms.has(p));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":";;AAKA,0BAEC;AAKD,sCAGC;AAKD,4CAGC;AArBD;;GAEG;AACH,SAAgB,OAAO,CAAC,IAAc,EAAE,GAAG,KAAe;IACxD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAc,EAAE,GAAG,WAAqB;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAc,EAAE,GAAG,WAAqB;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthUser } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Verify a JWT token using the configured RS256 public key.
|
|
4
|
+
* @deprecated Use JwtStrategy directly via extractUser(). Kept for backward compat.
|
|
5
|
+
*/
|
|
6
|
+
export declare function verifyToken(token: string): AuthUser;
|
|
7
|
+
/**
|
|
8
|
+
* Decode a base64-encoded JSON gateway header into AuthUser.
|
|
9
|
+
* @deprecated Use GatewayHeaderStrategy directly via extractUser(). Kept for backward compat.
|
|
10
|
+
*/
|
|
11
|
+
export declare function decodeGatewayHeader(base64Value: string): AuthUser;
|
|
12
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAc,MAAM,UAAU,CAAC;AAGhD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CA2BnD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAkBjE"}
|