@tekcify/auth-backend 1.0.0 → 1.0.3
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 +414 -22
- package/dist/application-management.d.ts +62 -0
- package/dist/application-management.d.ts.map +1 -0
- package/dist/application-management.js +133 -0
- package/dist/application-management.js.map +1 -0
- package/{src/express/index.ts → dist/express/index.d.ts} +1 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +6 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/middleware.d.ts +16 -0
- package/dist/express/middleware.d.ts.map +1 -0
- package/dist/express/middleware.js +39 -0
- package/dist/express/middleware.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/nestjs/decorator.d.ts +2 -0
- package/dist/nestjs/decorator.d.ts.map +1 -0
- package/dist/nestjs/decorator.js +11 -0
- package/dist/nestjs/decorator.js.map +1 -0
- package/dist/nestjs/guard.d.ts +13 -0
- package/dist/nestjs/guard.d.ts.map +1 -0
- package/dist/nestjs/guard.js +56 -0
- package/dist/nestjs/guard.js.map +1 -0
- package/{src/nestjs/index.ts → dist/nestjs/index.d.ts} +1 -0
- package/dist/nestjs/index.d.ts.map +1 -0
- package/dist/nestjs/index.js +8 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/user-profile.d.ts +18 -0
- package/dist/user-profile.d.ts.map +1 -0
- package/dist/user-profile.js +78 -0
- package/dist/user-profile.js.map +1 -0
- package/dist/userinfo.d.ts +9 -0
- package/dist/userinfo.d.ts.map +1 -0
- package/dist/userinfo.js +16 -0
- package/dist/userinfo.js.map +1 -0
- package/dist/verify.d.ts +4 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +38 -0
- package/dist/verify.js.map +1 -0
- package/package.json +13 -10
- package/src/__tests__/verify.test.ts +0 -80
- package/src/express/middleware.ts +0 -61
- package/src/nestjs/decorator.ts +0 -12
- package/src/nestjs/guard.ts +0 -57
- package/src/types.ts +0 -24
- package/src/userinfo.ts +0 -26
- package/src/verify.ts +0 -36
- package/tsconfig.json +0 -11
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.ts +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-management.js","sourceRoot":"","sources":["../src/application-management.ts"],"names":[],"mappings":";;AAsJA,4CAcC;AAED,4DAQC;AAED,8CAWC;AAED,8CAYC;AAED,8CAUC;AAED,sDAqBC;AA5OD,gEAA4D;AA4D5D,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAmB;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,kCAAe,GAAG,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB,EAAE,QAAgB;IACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IACE,OAAO;QACP,OAAO,OAAO,KAAK,QAAQ;QAC3B,SAAS,IAAI,OAAO;QACpB,OAAQ,OAAgC,CAAC,OAAO,KAAK,QAAQ;QAC5D,OAA+B,CAAC,OAAO,CAAC,IAAI,EAAE,EAC/C,CAAC;QACD,OAAQ,OAA+B,CAAC,OAAO,CAAC;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,OAAO,CAAI,MASzB;IACC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GACzE,MAAM,CAAC;IACT,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC;IAEpD,MAAM,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC1C,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAgB;QACxB,MAAM;QACN,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KACnE,CAAC;IAEF,IAAI,QAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAExD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,cAAc,CAC5B,OAAO,EACP,GAAG,YAAY,KAAK,QAAQ,CAAC,UAAU,aAAa,QAAQ,CAAC,MAAM,GAAG,CACvE,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,oBAAoB,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,OAAY,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAA2C;IAE3C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IAEnC,OAAO,OAAO,CAA2B;QACvC,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,6BAA6B;QAC3C,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;KACvB,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,QAAgB;IAEhB,OAAO,OAAO,CAA+C;QAC3D,IAAI,EAAE,4BAA4B,QAAQ,EAAE;QAC5C,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,2BAA2B;KAC1C,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,IAA0B;IAE1B,OAAO,OAAO,CAA4B;QACxC,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,8BAA8B;QAC5C,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,QAAgB,EAChB,IAA0B;IAE1B,OAAO,OAAO,CAAsB;QAClC,IAAI,EAAE,qBAAqB,QAAQ,EAAE;QACrC,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,8BAA8B;QAC5C,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,QAAgB;IAEhB,OAAO,OAAO,CAAsB;QAClC,IAAI,EAAE,qBAAqB,QAAQ,EAAE;QACrC,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,8BAA8B;QAC5C,KAAK,EAAE,WAAW;KACnB,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,QAAgB,EAChB,IAAiB,EACjB,QAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEhC,IAAI,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAqB;QACjC,IAAI,EAAE,qBAAqB,QAAQ,OAAO;QAC1C,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,mCAAmC;QACjD,KAAK,EAAE,WAAW;QAClB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthMiddleware = void 0;
|
|
4
|
+
var middleware_1 = require("./middleware");
|
|
5
|
+
Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return middleware_1.createAuthMiddleware; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":";;;AAAA,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import type { VerifyTokenOptions, UserPayload } from '../types';
|
|
3
|
+
export interface ExpressAuthOptions extends VerifyTokenOptions {
|
|
4
|
+
getUserInfo?: (userId: string) => Promise<{
|
|
5
|
+
email: string;
|
|
6
|
+
} | null>;
|
|
7
|
+
}
|
|
8
|
+
declare global {
|
|
9
|
+
namespace Express {
|
|
10
|
+
interface Request {
|
|
11
|
+
user?: UserPayload;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export declare function createAuthMiddleware(options: ExpressAuthOptions): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
16
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/express/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACrE;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE,WAAW,CAAC;SACpB;KACF;CACF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,IAE5D,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAsCjB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthMiddleware = createAuthMiddleware;
|
|
4
|
+
const verify_1 = require("../verify");
|
|
5
|
+
function createAuthMiddleware(options) {
|
|
6
|
+
return async (req, res, next) => {
|
|
7
|
+
const authHeader = req.headers.authorization;
|
|
8
|
+
if (!authHeader?.startsWith('Bearer ')) {
|
|
9
|
+
res
|
|
10
|
+
.status(401)
|
|
11
|
+
.json({ message: 'Missing or invalid authorization header' });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const token = authHeader.substring(7);
|
|
15
|
+
const verified = (0, verify_1.verifyAccessToken)(token, options);
|
|
16
|
+
if (!verified.valid) {
|
|
17
|
+
res.status(401).json({ message: 'Invalid or expired token' });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let email = '';
|
|
21
|
+
if (options.getUserInfo) {
|
|
22
|
+
const userInfo = await options.getUserInfo(verified.payload.sub);
|
|
23
|
+
if (!userInfo) {
|
|
24
|
+
res.status(401).json({ message: 'User not found' });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
email = userInfo.email;
|
|
28
|
+
}
|
|
29
|
+
req.user = {
|
|
30
|
+
userId: verified.payload.sub,
|
|
31
|
+
email,
|
|
32
|
+
scopes: Array.isArray(verified.payload.scopes)
|
|
33
|
+
? verified.payload.scopes
|
|
34
|
+
: [],
|
|
35
|
+
};
|
|
36
|
+
next();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/express/middleware.ts"],"names":[],"mappings":";;AAiBA,oDA2CC;AA3DD,sCAA8C;AAgB9C,SAAgB,oBAAoB,CAAC,OAA2B;IAC9D,OAAO,KAAK,EACV,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;QACjB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAmC,CAAC;QAEnE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,GAAG;iBACA,MAAM,CAAC,GAAG,CAAC;iBACX,IAAI,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAA,0BAAiB,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACzB,CAAC;QAED,GAAG,CAAC,IAAI,GAAG;YACT,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG;YAC5B,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC5C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM;gBACzB,CAAC,CAAC,EAAE;SACP,CAAC;QAEF,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
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("./types"), exports);
|
|
18
|
+
__exportStar(require("./verify"), exports);
|
|
19
|
+
__exportStar(require("./userinfo"), exports);
|
|
20
|
+
__exportStar(require("./user-profile"), exports);
|
|
21
|
+
__exportStar(require("./application-management"), exports);
|
|
22
|
+
__exportStar(require("./nestjs"), exports);
|
|
23
|
+
__exportStar(require("./express"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,2DAAyC;AACzC,2CAAyB;AACzB,4CAA0B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/nestjs/decorator.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,mDAOvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CurrentUser = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
6
|
+
const request = ctx
|
|
7
|
+
.switchToHttp()
|
|
8
|
+
.getRequest();
|
|
9
|
+
return request.user;
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorator.js","sourceRoot":"","sources":["../../src/nestjs/decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAI3D,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAa,EAAE,GAAqB,EAA2B,EAAE;IAChE,MAAM,OAAO,GAAG,GAAG;SAChB,YAAY,EAAE;SACd,UAAU,EAAoC,CAAC;IAClD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import type { VerifyTokenOptions } from '../types';
|
|
3
|
+
export interface JwtAuthGuardOptions extends VerifyTokenOptions {
|
|
4
|
+
getUserInfo?: (userId: string) => Promise<{
|
|
5
|
+
email: string;
|
|
6
|
+
} | null>;
|
|
7
|
+
}
|
|
8
|
+
export declare class JwtAuthGuard implements CanActivate {
|
|
9
|
+
private readonly options;
|
|
10
|
+
constructor(options: JwtAuthGuardOptions);
|
|
11
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/nestjs/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACrE;AAED,qBACa,YAAa,YAAW,WAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,mBAAmB;IAEnD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAsC/D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.JwtAuthGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const verify_1 = require("../verify");
|
|
15
|
+
let JwtAuthGuard = class JwtAuthGuard {
|
|
16
|
+
options;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
async canActivate(context) {
|
|
21
|
+
const request = context
|
|
22
|
+
.switchToHttp()
|
|
23
|
+
.getRequest();
|
|
24
|
+
const authHeader = request.headers.authorization;
|
|
25
|
+
if (!authHeader?.startsWith('Bearer ')) {
|
|
26
|
+
throw new common_1.UnauthorizedException('Missing or invalid authorization header');
|
|
27
|
+
}
|
|
28
|
+
const token = authHeader.substring(7);
|
|
29
|
+
const verified = (0, verify_1.verifyAccessToken)(token, this.options);
|
|
30
|
+
if (!verified.valid) {
|
|
31
|
+
throw new common_1.UnauthorizedException('Invalid or expired token');
|
|
32
|
+
}
|
|
33
|
+
let email = '';
|
|
34
|
+
if (this.options.getUserInfo) {
|
|
35
|
+
const userInfo = await this.options.getUserInfo(verified.payload.sub);
|
|
36
|
+
if (!userInfo) {
|
|
37
|
+
throw new common_1.UnauthorizedException('User not found');
|
|
38
|
+
}
|
|
39
|
+
email = userInfo.email;
|
|
40
|
+
}
|
|
41
|
+
request.user = {
|
|
42
|
+
userId: verified.payload.sub,
|
|
43
|
+
email,
|
|
44
|
+
scopes: Array.isArray(verified.payload.scopes)
|
|
45
|
+
? verified.payload.scopes
|
|
46
|
+
: [],
|
|
47
|
+
};
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.JwtAuthGuard = JwtAuthGuard;
|
|
52
|
+
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
53
|
+
(0, common_1.Injectable)(),
|
|
54
|
+
__metadata("design:paramtypes", [Object])
|
|
55
|
+
], JwtAuthGuard);
|
|
56
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/nestjs/guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,sCAA8C;AAQvC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACM;IAA7B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAE7D,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO;aACpB,YAAY,EAAE;aACd,UAAU,EAAoC,CAAC;QAClD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAmC,CAAC;QAEvE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,8BAAqB,CAC7B,yCAAyC,CAC1C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAA,0BAAiB,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,8BAAqB,CAAC,0BAA0B,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,8BAAqB,CAAC,gBAAgB,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,IAAI,GAAG;YACb,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG;YAC5B,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC5C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM;gBACzB,CAAC,CAAC,EAAE;SACP,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAzCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;;GACA,YAAY,CAyCxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CurrentUser = exports.JwtAuthGuard = void 0;
|
|
4
|
+
var guard_1 = require("./guard");
|
|
5
|
+
Object.defineProperty(exports, "JwtAuthGuard", { enumerable: true, get: function () { return guard_1.JwtAuthGuard; } });
|
|
6
|
+
var decorator_1 = require("./decorator");
|
|
7
|
+
Object.defineProperty(exports, "CurrentUser", { enumerable: true, get: function () { return decorator_1.CurrentUser; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":";;;AAAA,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AAErB,yCAA0C;AAAjC,wGAAA,WAAW,OAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface TokenPayload {
|
|
2
|
+
sub: string;
|
|
3
|
+
type: 'access' | 'refresh' | 'temp';
|
|
4
|
+
scopes?: string[];
|
|
5
|
+
clientId?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface VerifyTokenOptions {
|
|
9
|
+
secret: string;
|
|
10
|
+
issuer?: string;
|
|
11
|
+
audience?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface VerifiedToken {
|
|
14
|
+
payload: TokenPayload;
|
|
15
|
+
valid: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface UserPayload {
|
|
18
|
+
userId: string;
|
|
19
|
+
email: string;
|
|
20
|
+
scopes?: string[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface UserProfile {
|
|
2
|
+
userId: string;
|
|
3
|
+
email: string;
|
|
4
|
+
firstName: string | null;
|
|
5
|
+
lastName: string | null;
|
|
6
|
+
avatarUrl: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface UpdateProfileDto {
|
|
9
|
+
firstName?: string;
|
|
10
|
+
lastName?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface UploadResponse {
|
|
13
|
+
avatarUrl: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function getUserProfile(accessToken: string): Promise<UserProfile>;
|
|
16
|
+
export declare function updateUserProfile(accessToken: string, data: UpdateProfileDto): Promise<UserProfile>;
|
|
17
|
+
export declare function uploadProfilePicture(accessToken: string, file: Blob | File, fileName?: string): Promise<UploadResponse>;
|
|
18
|
+
//# sourceMappingURL=user-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-profile.d.ts","sourceRoot":"","sources":["../src/user-profile.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,WAAW,CAAC,CAwBtB;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CA+BzB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUserProfile = getUserProfile;
|
|
4
|
+
exports.updateUserProfile = updateUserProfile;
|
|
5
|
+
exports.uploadProfilePicture = uploadProfilePicture;
|
|
6
|
+
const auth_core_client_1 = require("@tekcify/auth-core-client");
|
|
7
|
+
async function getUserProfile(accessToken) {
|
|
8
|
+
const response = await fetch(`${auth_core_client_1.AUTH_SERVER_URL}/api/user/profile`, {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
headers: {
|
|
11
|
+
Authorization: `Bearer ${accessToken}`,
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
if (!response.ok) {
|
|
16
|
+
const error = await response
|
|
17
|
+
.json()
|
|
18
|
+
.catch(() => ({ message: response.statusText }));
|
|
19
|
+
const errorMessage = error?.message &&
|
|
20
|
+
typeof error.message === 'string' &&
|
|
21
|
+
error.message.trim()
|
|
22
|
+
? error.message
|
|
23
|
+
: `Failed to get user profile: ${response.statusText} (Status: ${response.status})`;
|
|
24
|
+
throw new Error(errorMessage);
|
|
25
|
+
}
|
|
26
|
+
return response.json();
|
|
27
|
+
}
|
|
28
|
+
async function updateUserProfile(accessToken, data) {
|
|
29
|
+
const response = await fetch(`${auth_core_client_1.AUTH_SERVER_URL}/api/user/profile`, {
|
|
30
|
+
method: 'PUT',
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${accessToken}`,
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
},
|
|
35
|
+
body: JSON.stringify(data),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const error = await response
|
|
39
|
+
.json()
|
|
40
|
+
.catch(() => ({ message: response.statusText }));
|
|
41
|
+
const errorMessage = error?.message &&
|
|
42
|
+
typeof error.message === 'string' &&
|
|
43
|
+
error.message.trim()
|
|
44
|
+
? error.message
|
|
45
|
+
: `Failed to update user profile: ${response.statusText} (Status: ${response.status})`;
|
|
46
|
+
throw new Error(errorMessage);
|
|
47
|
+
}
|
|
48
|
+
return response.json();
|
|
49
|
+
}
|
|
50
|
+
async function uploadProfilePicture(accessToken, file, fileName) {
|
|
51
|
+
const formData = new FormData();
|
|
52
|
+
if (fileName && !(file instanceof File)) {
|
|
53
|
+
formData.append('file', file, fileName);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
formData.append('file', file);
|
|
57
|
+
}
|
|
58
|
+
const response = await fetch(`${auth_core_client_1.AUTH_SERVER_URL}/api/user/profile/picture`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
Authorization: `Bearer ${accessToken}`,
|
|
62
|
+
},
|
|
63
|
+
body: formData,
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const error = await response
|
|
67
|
+
.json()
|
|
68
|
+
.catch(() => ({ message: response.statusText }));
|
|
69
|
+
const errorMessage = error?.message &&
|
|
70
|
+
typeof error.message === 'string' &&
|
|
71
|
+
error.message.trim()
|
|
72
|
+
? error.message
|
|
73
|
+
: `Failed to upload profile picture: ${response.statusText} (Status: ${response.status})`;
|
|
74
|
+
throw new Error(errorMessage);
|
|
75
|
+
}
|
|
76
|
+
return response.json();
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=user-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../src/user-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { UserInfo, IntrospectResult } from '@tekcify/auth-core-client';
|
|
2
|
+
export declare function fetchUserInfo(accessToken: string): Promise<UserInfo>;
|
|
3
|
+
export interface IntrospectTokenOptions {
|
|
4
|
+
token: string;
|
|
5
|
+
clientId?: string;
|
|
6
|
+
clientSecret?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function introspectAccessToken(options: IntrospectTokenOptions): Promise<IntrospectResult>;
|
|
9
|
+
//# sourceMappingURL=userinfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userinfo.d.ts","sourceRoot":"","sources":["../src/userinfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG5E,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE1E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAM3B"}
|
package/dist/userinfo.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchUserInfo = fetchUserInfo;
|
|
4
|
+
exports.introspectAccessToken = introspectAccessToken;
|
|
5
|
+
const auth_core_client_1 = require("@tekcify/auth-core-client");
|
|
6
|
+
async function fetchUserInfo(accessToken) {
|
|
7
|
+
return (0, auth_core_client_1.getUserInfo)(accessToken);
|
|
8
|
+
}
|
|
9
|
+
async function introspectAccessToken(options) {
|
|
10
|
+
return (0, auth_core_client_1.introspectToken)({
|
|
11
|
+
token: options.token,
|
|
12
|
+
clientId: options.clientId,
|
|
13
|
+
clientSecret: options.clientSecret,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=userinfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userinfo.js","sourceRoot":"","sources":["../src/userinfo.ts"],"names":[],"mappings":";;AAGA,sCAEC;AAQD,sDAQC;AApBD,gEAAyE;AAElE,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,OAAO,IAAA,8BAAW,EAAC,WAAW,CAAC,CAAC;AAClC,CAAC;AAQM,KAAK,UAAU,qBAAqB,CACzC,OAA+B;IAE/B,OAAO,IAAA,kCAAe,EAAC;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/verify.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TokenPayload, VerifyTokenOptions, VerifiedToken } from './types';
|
|
2
|
+
export declare function verifyAccessToken(token: string, options: VerifyTokenOptions): VerifiedToken;
|
|
3
|
+
export declare function decodeToken(token: string): TokenPayload | null;
|
|
4
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,GAC1B,aAAa,CAqBf;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAM9D"}
|
package/dist/verify.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.verifyAccessToken = verifyAccessToken;
|
|
7
|
+
exports.decodeToken = decodeToken;
|
|
8
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
+
function verifyAccessToken(token, options) {
|
|
10
|
+
try {
|
|
11
|
+
const decoded = jsonwebtoken_1.default.verify(token, options.secret, {
|
|
12
|
+
issuer: options.issuer ?? 'tekcify-auth',
|
|
13
|
+
audience: options.audience ?? 'tekcify-api',
|
|
14
|
+
});
|
|
15
|
+
if (decoded.type !== 'access') {
|
|
16
|
+
return { payload: decoded, valid: false };
|
|
17
|
+
}
|
|
18
|
+
return { payload: decoded, valid: true };
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof jsonwebtoken_1.default.JsonWebTokenError) {
|
|
22
|
+
return { payload: {}, valid: false };
|
|
23
|
+
}
|
|
24
|
+
if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
|
|
25
|
+
return { payload: {}, valid: false };
|
|
26
|
+
}
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function decodeToken(token) {
|
|
31
|
+
try {
|
|
32
|
+
return jsonwebtoken_1.default.decode(token);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":";;;;;AAGA,8CAwBC;AAED,kCAMC;AAnCD,gEAA+B;AAG/B,SAAgB,iBAAiB,CAC/B,KAAa,EACb,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;YAChD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa;SAC5C,CAAiB,CAAC;QAEnB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAG,CAAC,iBAAiB,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,EAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,YAAY,sBAAG,CAAC,iBAAiB,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,EAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACvD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,OAAO,sBAAG,CAAC,MAAM,CAAC,KAAK,CAAwB,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekcify/auth-backend",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Backend authentication helpers for Tekcify Auth. Provides middleware, guards, and utilities for validating JWT tokens and protecting API routes in NestJS and Express applications.",
|
|
5
5
|
"author": "Tekcify",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
|
-
"build": "tsc",
|
|
34
|
+
"build": "tsc -p tsconfig.build.json",
|
|
35
35
|
"clean": "rm -rf dist",
|
|
36
36
|
"lint": "eslint \"src/**/*.ts\" --max-warnings=0",
|
|
37
37
|
"test": "vitest run",
|
|
@@ -44,18 +44,22 @@
|
|
|
44
44
|
"jwt",
|
|
45
45
|
"auth"
|
|
46
46
|
],
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"README.md"
|
|
50
|
+
],
|
|
47
51
|
"license": "MIT",
|
|
48
52
|
"dependencies": {
|
|
49
|
-
"@tekcify/auth-core-client": "^1.0.
|
|
50
|
-
"jsonwebtoken": "^9.0.
|
|
53
|
+
"@tekcify/auth-core-client": "^1.0.6",
|
|
54
|
+
"jsonwebtoken": "^9.0.3"
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
53
|
-
"@nestjs/common": "^11.
|
|
54
|
-
"@nestjs/core": "^11.
|
|
55
|
-
"@types/express": "^5.0.
|
|
57
|
+
"@nestjs/common": "^11.1.9",
|
|
58
|
+
"@nestjs/core": "^11.1.9",
|
|
59
|
+
"@types/express": "^5.0.6",
|
|
56
60
|
"@types/jsonwebtoken": "^9.0.10",
|
|
57
|
-
"@types/node": "^
|
|
58
|
-
"typescript": "^5.
|
|
61
|
+
"@types/node": "^24.10.1",
|
|
62
|
+
"typescript": "^5.9.3",
|
|
59
63
|
"vitest": "^4.0.15"
|
|
60
64
|
},
|
|
61
65
|
"peerDependencies": {
|
|
@@ -63,4 +67,3 @@
|
|
|
63
67
|
"@nestjs/core": "^11.0.0"
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
|
-
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import jwt from 'jsonwebtoken';
|
|
3
|
-
import { verifyAccessToken } from '../verify';
|
|
4
|
-
|
|
5
|
-
describe('verifyAccessToken', () => {
|
|
6
|
-
const secret = 'test-secret';
|
|
7
|
-
const issuer = 'tekcify-auth';
|
|
8
|
-
const audience = 'tekcify-api';
|
|
9
|
-
|
|
10
|
-
it('should verify a valid access token', () => {
|
|
11
|
-
const payload = {
|
|
12
|
-
sub: 'user-123',
|
|
13
|
-
type: 'access',
|
|
14
|
-
scopes: ['read:profile'],
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const token = jwt.sign(payload, secret, {
|
|
18
|
-
issuer,
|
|
19
|
-
audience,
|
|
20
|
-
expiresIn: '1h',
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const result = verifyAccessToken(token, { secret, issuer, audience });
|
|
24
|
-
|
|
25
|
-
expect(result.valid).toBe(true);
|
|
26
|
-
expect(result.payload.sub).toBe('user-123');
|
|
27
|
-
expect(result.payload.type).toBe('access');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('should reject a refresh token', () => {
|
|
31
|
-
const payload = {
|
|
32
|
-
sub: 'user-123',
|
|
33
|
-
type: 'refresh',
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const token = jwt.sign(payload, secret, {
|
|
37
|
-
issuer,
|
|
38
|
-
audience,
|
|
39
|
-
expiresIn: '7d',
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const result = verifyAccessToken(token, { secret, issuer, audience });
|
|
43
|
-
|
|
44
|
-
expect(result.valid).toBe(false);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should reject an expired token', () => {
|
|
48
|
-
const payload = {
|
|
49
|
-
sub: 'user-123',
|
|
50
|
-
type: 'access',
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const token = jwt.sign(payload, secret, {
|
|
54
|
-
issuer,
|
|
55
|
-
audience,
|
|
56
|
-
expiresIn: '-1h',
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const result = verifyAccessToken(token, { secret, issuer, audience });
|
|
60
|
-
|
|
61
|
-
expect(result.valid).toBe(false);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('should reject a token with wrong secret', () => {
|
|
65
|
-
const payload = {
|
|
66
|
-
sub: 'user-123',
|
|
67
|
-
type: 'access',
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const token = jwt.sign(payload, 'wrong-secret', {
|
|
71
|
-
issuer,
|
|
72
|
-
audience,
|
|
73
|
-
expiresIn: '1h',
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const result = verifyAccessToken(token, { secret, issuer, audience });
|
|
77
|
-
|
|
78
|
-
expect(result.valid).toBe(false);
|
|
79
|
-
});
|
|
80
|
-
});
|