win-portal-auth-sdk 1.0.3 → 1.1.1
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 +146 -1
- package/TYPE_SAFETY.md +97 -0
- package/dist/client/api/auth.api.d.ts +58 -4
- package/dist/client/api/auth.api.d.ts.map +1 -1
- package/dist/client/api/auth.api.js +68 -6
- package/dist/client/api/event-log.api.d.ts.map +1 -1
- package/dist/client/api/event-log.api.js +5 -3
- package/dist/client/api/files.api.d.ts +5 -5
- package/dist/client/api/files.api.d.ts.map +1 -1
- package/dist/client/api/files.api.js +6 -6
- package/dist/client/api/index.d.ts +5 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/client/api/index.js +8 -1
- package/dist/client/api/line.api.d.ts +150 -0
- package/dist/client/api/line.api.d.ts.map +1 -0
- package/dist/client/api/line.api.js +114 -0
- package/dist/client/api/oauth.api.d.ts +221 -0
- package/dist/client/api/oauth.api.d.ts.map +1 -0
- package/dist/client/api/oauth.api.js +258 -0
- package/dist/client/api/system-config.api.d.ts +4 -14
- package/dist/client/api/system-config.api.d.ts.map +1 -1
- package/dist/client/api/system-config.api.js +2 -10
- package/dist/client/auth-client.d.ts +16 -1
- package/dist/client/auth-client.d.ts.map +1 -1
- package/dist/client/auth-client.js +16 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/middleware/express.middleware.d.ts +62 -0
- package/dist/middleware/express.middleware.d.ts.map +1 -0
- package/dist/middleware/express.middleware.js +185 -0
- package/dist/middleware/express.types.d.ts +28 -0
- package/dist/middleware/express.types.d.ts.map +1 -0
- package/dist/middleware/express.types.js +7 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +26 -0
- package/dist/middleware/nestjs.decorators.d.ts +31 -0
- package/dist/middleware/nestjs.decorators.d.ts.map +1 -0
- package/dist/middleware/nestjs.decorators.js +56 -0
- package/dist/middleware/nestjs.guard.d.ts +55 -0
- package/dist/middleware/nestjs.guard.d.ts.map +1 -0
- package/dist/middleware/nestjs.guard.js +188 -0
- package/dist/middleware/types.d.ts +59 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +5 -0
- package/dist/types/auth.types.d.ts +16 -13
- package/dist/types/auth.types.d.ts.map +1 -1
- package/dist/types/auth.types.js +2 -2
- package/dist/types/file.types.d.ts +13 -9
- package/dist/types/file.types.d.ts.map +1 -1
- package/dist/types/file.types.js +2 -2
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/system-config.types.d.ts +8 -18
- package/dist/types/system-config.types.d.ts.map +1 -1
- package/dist/types/system-config.types.js +2 -2
- package/package.json +2 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express Type Extensions
|
|
3
|
+
*
|
|
4
|
+
* Extends Express Request interface to include auth properties
|
|
5
|
+
*/
|
|
6
|
+
import { User } from '../types';
|
|
7
|
+
declare global {
|
|
8
|
+
namespace Express {
|
|
9
|
+
interface Request {
|
|
10
|
+
/**
|
|
11
|
+
* Authenticated user profile
|
|
12
|
+
* - Set by authMiddleware when token is valid
|
|
13
|
+
* - null when optional=true and no token provided
|
|
14
|
+
* - undefined when middleware not applied to route
|
|
15
|
+
*/
|
|
16
|
+
user?: User | null;
|
|
17
|
+
/**
|
|
18
|
+
* Access token used for authentication
|
|
19
|
+
* - Extracted from Authorization header or cookie
|
|
20
|
+
* - null when optional=true and no token provided
|
|
21
|
+
* - undefined when middleware not applied to route
|
|
22
|
+
*/
|
|
23
|
+
token?: string | null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=express.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.types.d.ts","sourceRoot":"","sources":["../../src/middleware/express.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf;;;;;eAKG;YACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;YAEnB;;;;;eAKG;YACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SACvB;KACF;CACF;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware exports
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
// Types
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
22
|
+
// Express Middleware (includes type augmentation)
|
|
23
|
+
__exportStar(require("./express.middleware"), exports);
|
|
24
|
+
// NestJS Guard
|
|
25
|
+
__exportStar(require("./nestjs.guard"), exports);
|
|
26
|
+
__exportStar(require("./nestjs.decorators"), exports);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NestJS Decorators
|
|
3
|
+
*
|
|
4
|
+
* Note: These are simplified decorators.
|
|
5
|
+
* For full NestJS integration, use @nestjs/common createParamDecorator
|
|
6
|
+
*
|
|
7
|
+
* @example Full NestJS implementation:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // In your app
|
|
10
|
+
* import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
11
|
+
*
|
|
12
|
+
* export const CurrentUser = createParamDecorator(
|
|
13
|
+
* (data: unknown, ctx: ExecutionContext) => {
|
|
14
|
+
* const request = ctx.switchToHttp().getRequest();
|
|
15
|
+
* return request.user;
|
|
16
|
+
* },
|
|
17
|
+
* );
|
|
18
|
+
*
|
|
19
|
+
* export const CurrentToken = createParamDecorator(
|
|
20
|
+
* (data: unknown, ctx: ExecutionContext) => {
|
|
21
|
+
* const request = ctx.switchToHttp().getRequest();
|
|
22
|
+
* return request.token;
|
|
23
|
+
* },
|
|
24
|
+
* );
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Instructions for using with NestJS
|
|
29
|
+
*/
|
|
30
|
+
export declare const NESTJS_DECORATOR_INSTRUCTIONS = "\nTo use decorators in your NestJS app, create these in your auth module:\n\n// auth/decorators/current-user.decorator.ts\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport { User } from 'win-portal-auth-sdk';\n\nexport const CurrentUser = createParamDecorator(\n (data: unknown, ctx: ExecutionContext): User => {\n const request = ctx.switchToHttp().getRequest();\n return request.user;\n },\n);\n\n// auth/decorators/current-token.decorator.ts\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\nexport const CurrentToken = createParamDecorator(\n (data: unknown, ctx: ExecutionContext): string => {\n const request = ctx.switchToHttp().getRequest();\n return request.token;\n },\n);\n";
|
|
31
|
+
//# sourceMappingURL=nestjs.decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.decorators.d.ts","sourceRoot":"","sources":["../../src/middleware/nestjs.decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;GAEG;AACH,eAAO,MAAM,6BAA6B,4vBAuBzC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NestJS Decorators
|
|
4
|
+
*
|
|
5
|
+
* Note: These are simplified decorators.
|
|
6
|
+
* For full NestJS integration, use @nestjs/common createParamDecorator
|
|
7
|
+
*
|
|
8
|
+
* @example Full NestJS implementation:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // In your app
|
|
11
|
+
* import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
12
|
+
*
|
|
13
|
+
* export const CurrentUser = createParamDecorator(
|
|
14
|
+
* (data: unknown, ctx: ExecutionContext) => {
|
|
15
|
+
* const request = ctx.switchToHttp().getRequest();
|
|
16
|
+
* return request.user;
|
|
17
|
+
* },
|
|
18
|
+
* );
|
|
19
|
+
*
|
|
20
|
+
* export const CurrentToken = createParamDecorator(
|
|
21
|
+
* (data: unknown, ctx: ExecutionContext) => {
|
|
22
|
+
* const request = ctx.switchToHttp().getRequest();
|
|
23
|
+
* return request.token;
|
|
24
|
+
* },
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.NESTJS_DECORATOR_INSTRUCTIONS = void 0;
|
|
30
|
+
/**
|
|
31
|
+
* Instructions for using with NestJS
|
|
32
|
+
*/
|
|
33
|
+
exports.NESTJS_DECORATOR_INSTRUCTIONS = `
|
|
34
|
+
To use decorators in your NestJS app, create these in your auth module:
|
|
35
|
+
|
|
36
|
+
// auth/decorators/current-user.decorator.ts
|
|
37
|
+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
38
|
+
import { User } from 'win-portal-auth-sdk';
|
|
39
|
+
|
|
40
|
+
export const CurrentUser = createParamDecorator(
|
|
41
|
+
(data: unknown, ctx: ExecutionContext): User => {
|
|
42
|
+
const request = ctx.switchToHttp().getRequest();
|
|
43
|
+
return request.user;
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// auth/decorators/current-token.decorator.ts
|
|
48
|
+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
49
|
+
|
|
50
|
+
export const CurrentToken = createParamDecorator(
|
|
51
|
+
(data: unknown, ctx: ExecutionContext): string => {
|
|
52
|
+
const request = ctx.switchToHttp().getRequest();
|
|
53
|
+
return request.token;
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
`;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NestJS Guard for Win Portal Auth
|
|
3
|
+
*
|
|
4
|
+
* Guard and Decorators for NestJS applications
|
|
5
|
+
*/
|
|
6
|
+
import { MiddlewareConfig } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* NestJS Auth Guard
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // In your auth.guard.ts
|
|
13
|
+
* import { createAuthGuard } from 'win-portal-auth-sdk';
|
|
14
|
+
*
|
|
15
|
+
* export const AuthGuard = createAuthGuard({
|
|
16
|
+
* baseURL: process.env.API_BASE_URL,
|
|
17
|
+
* apiKey: process.env.API_KEY
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // In your controller
|
|
21
|
+
* @UseGuards(AuthGuard)
|
|
22
|
+
* @Get('profile')
|
|
23
|
+
* getProfile(@CurrentUser() user: User) {
|
|
24
|
+
* return user;
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function createAuthGuard(config: Omit<MiddlewareConfig, 'optional'>): {
|
|
29
|
+
new (): {
|
|
30
|
+
canActivate(context: any): Promise<boolean>;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Optional Auth Guard - Does not block if no token
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* @UseGuards(OptionalAuthGuard)
|
|
39
|
+
* @Get('posts')
|
|
40
|
+
* getPosts(@CurrentUser() user: User | null) {
|
|
41
|
+
* // user may be null
|
|
42
|
+
* return user ? 'Your posts' : 'Public posts';
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function createOptionalAuthGuard(config: Omit<MiddlewareConfig, 'optional'>): {
|
|
47
|
+
new (): {
|
|
48
|
+
canActivate(context: any): Promise<boolean>;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Clear user cache
|
|
53
|
+
*/
|
|
54
|
+
export declare function clearNestAuthCache(token?: string): void;
|
|
55
|
+
//# sourceMappingURL=nestjs.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.guard.d.ts","sourceRoot":"","sources":["../../src/middleware/nestjs.guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AAWxD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC;;6BAY3C,GAAG,GAAG,QAAQ,OAAO,CAAC;;EAgEpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC;;6BAYnD,GAAG,GAAG,QAAQ,OAAO,CAAC;;EAyDpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,QAMhD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NestJS Guard for Win Portal Auth
|
|
4
|
+
*
|
|
5
|
+
* Guard and Decorators for NestJS applications
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.clearNestAuthCache = exports.createOptionalAuthGuard = exports.createAuthGuard = void 0;
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const userCache = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* NestJS Auth Guard
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // In your auth.guard.ts
|
|
17
|
+
* import { createAuthGuard } from 'win-portal-auth-sdk';
|
|
18
|
+
*
|
|
19
|
+
* export const AuthGuard = createAuthGuard({
|
|
20
|
+
* baseURL: process.env.API_BASE_URL,
|
|
21
|
+
* apiKey: process.env.API_KEY
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // In your controller
|
|
25
|
+
* @UseGuards(AuthGuard)
|
|
26
|
+
* @Get('profile')
|
|
27
|
+
* getProfile(@CurrentUser() user: User) {
|
|
28
|
+
* return user;
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
function createAuthGuard(config) {
|
|
33
|
+
const client = new client_1.AuthClient({
|
|
34
|
+
baseURL: config.baseURL,
|
|
35
|
+
apiKey: config.apiKey,
|
|
36
|
+
apiKeyHeader: config.apiKeyHeader,
|
|
37
|
+
});
|
|
38
|
+
const cacheTimeout = (config.cacheTimeout || 300) * 1000;
|
|
39
|
+
const tokenStrategy = config.tokenStrategy || 'bearer';
|
|
40
|
+
const cookieName = config.cookieName || 'access_token';
|
|
41
|
+
class AuthGuard {
|
|
42
|
+
async canActivate(context) {
|
|
43
|
+
const request = context.switchToHttp().getRequest();
|
|
44
|
+
// Extract token
|
|
45
|
+
let token = null;
|
|
46
|
+
if (config.tokenExtractor) {
|
|
47
|
+
token = config.tokenExtractor(request);
|
|
48
|
+
}
|
|
49
|
+
else if (tokenStrategy === 'bearer') {
|
|
50
|
+
const authHeader = request.headers.authorization;
|
|
51
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
52
|
+
token = authHeader.substring(7);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (tokenStrategy === 'cookie') {
|
|
56
|
+
token = request.cookies?.[cookieName] || null;
|
|
57
|
+
}
|
|
58
|
+
if (!token) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
// Check cache first
|
|
63
|
+
const cached = userCache.get(token);
|
|
64
|
+
if (cached && Date.now() - cached.timestamp < cacheTimeout) {
|
|
65
|
+
request.user = cached.user;
|
|
66
|
+
request.token = token;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
// Fetch user profile
|
|
70
|
+
client.setToken(token);
|
|
71
|
+
const user = await client.auth.profile();
|
|
72
|
+
// Update cache
|
|
73
|
+
userCache.set(token, {
|
|
74
|
+
user,
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
});
|
|
77
|
+
// Clean up old cache entries
|
|
78
|
+
if (userCache.size > 1000) {
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
const entries = Array.from(userCache.entries());
|
|
81
|
+
for (const [key, entry] of entries) {
|
|
82
|
+
if (now - entry.timestamp > cacheTimeout) {
|
|
83
|
+
userCache.delete(key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Attach user to request
|
|
88
|
+
request.user = user;
|
|
89
|
+
request.token = token;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
userCache.delete(token);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return AuthGuard;
|
|
99
|
+
}
|
|
100
|
+
exports.createAuthGuard = createAuthGuard;
|
|
101
|
+
/**
|
|
102
|
+
* Optional Auth Guard - Does not block if no token
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* @UseGuards(OptionalAuthGuard)
|
|
107
|
+
* @Get('posts')
|
|
108
|
+
* getPosts(@CurrentUser() user: User | null) {
|
|
109
|
+
* // user may be null
|
|
110
|
+
* return user ? 'Your posts' : 'Public posts';
|
|
111
|
+
* }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
function createOptionalAuthGuard(config) {
|
|
115
|
+
const client = new client_1.AuthClient({
|
|
116
|
+
baseURL: config.baseURL,
|
|
117
|
+
apiKey: config.apiKey,
|
|
118
|
+
apiKeyHeader: config.apiKeyHeader,
|
|
119
|
+
});
|
|
120
|
+
const cacheTimeout = (config.cacheTimeout || 300) * 1000;
|
|
121
|
+
const tokenStrategy = config.tokenStrategy || 'bearer';
|
|
122
|
+
const cookieName = config.cookieName || 'access_token';
|
|
123
|
+
class OptionalAuthGuard {
|
|
124
|
+
async canActivate(context) {
|
|
125
|
+
const request = context.switchToHttp().getRequest();
|
|
126
|
+
// Extract token
|
|
127
|
+
let token = null;
|
|
128
|
+
if (config.tokenExtractor) {
|
|
129
|
+
token = config.tokenExtractor(request);
|
|
130
|
+
}
|
|
131
|
+
else if (tokenStrategy === 'bearer') {
|
|
132
|
+
const authHeader = request.headers.authorization;
|
|
133
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
134
|
+
token = authHeader.substring(7);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (tokenStrategy === 'cookie') {
|
|
138
|
+
token = request.cookies?.[cookieName] || null;
|
|
139
|
+
}
|
|
140
|
+
if (!token) {
|
|
141
|
+
request.user = null;
|
|
142
|
+
request.token = null;
|
|
143
|
+
return true; // Allow access even without token
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
// Check cache first
|
|
147
|
+
const cached = userCache.get(token);
|
|
148
|
+
if (cached && Date.now() - cached.timestamp < cacheTimeout) {
|
|
149
|
+
request.user = cached.user;
|
|
150
|
+
request.token = token;
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
// Fetch user profile
|
|
154
|
+
client.setToken(token);
|
|
155
|
+
const user = await client.auth.profile();
|
|
156
|
+
// Update cache
|
|
157
|
+
userCache.set(token, {
|
|
158
|
+
user,
|
|
159
|
+
timestamp: Date.now(),
|
|
160
|
+
});
|
|
161
|
+
// Attach user to request
|
|
162
|
+
request.user = user;
|
|
163
|
+
request.token = token;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
userCache.delete(token);
|
|
168
|
+
request.user = null;
|
|
169
|
+
request.token = null;
|
|
170
|
+
return true; // Allow access even on error
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return OptionalAuthGuard;
|
|
175
|
+
}
|
|
176
|
+
exports.createOptionalAuthGuard = createOptionalAuthGuard;
|
|
177
|
+
/**
|
|
178
|
+
* Clear user cache
|
|
179
|
+
*/
|
|
180
|
+
function clearNestAuthCache(token) {
|
|
181
|
+
if (token) {
|
|
182
|
+
userCache.delete(token);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
userCache.clear();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.clearNestAuthCache = clearNestAuthCache;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware Types
|
|
3
|
+
*/
|
|
4
|
+
import { User } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Auth Context - Simple and direct
|
|
7
|
+
*/
|
|
8
|
+
export interface AuthContext {
|
|
9
|
+
user: User | null;
|
|
10
|
+
token: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Middleware Configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface MiddlewareConfig {
|
|
16
|
+
/**
|
|
17
|
+
* API base URL
|
|
18
|
+
*/
|
|
19
|
+
baseURL: string;
|
|
20
|
+
/**
|
|
21
|
+
* API Key for SDK
|
|
22
|
+
*/
|
|
23
|
+
apiKey: string;
|
|
24
|
+
/**
|
|
25
|
+
* Custom API key header name
|
|
26
|
+
* @default 'X-API-Key'
|
|
27
|
+
*/
|
|
28
|
+
apiKeyHeader?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Token extraction strategy
|
|
31
|
+
* @default 'bearer'
|
|
32
|
+
*/
|
|
33
|
+
tokenStrategy?: 'bearer' | 'cookie' | 'custom';
|
|
34
|
+
/**
|
|
35
|
+
* Cookie name when using cookie strategy
|
|
36
|
+
* @default 'access_token'
|
|
37
|
+
*/
|
|
38
|
+
cookieName?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Custom token extractor
|
|
41
|
+
*/
|
|
42
|
+
tokenExtractor?: (req: any) => string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Skip authentication for these paths (regex patterns)
|
|
45
|
+
*/
|
|
46
|
+
excludePaths?: (string | RegExp)[];
|
|
47
|
+
/**
|
|
48
|
+
* Cache user profile for this duration (in seconds)
|
|
49
|
+
* @default 300 (5 minutes)
|
|
50
|
+
*/
|
|
51
|
+
cacheTimeout?: number;
|
|
52
|
+
/**
|
|
53
|
+
* When true, middleware will not throw on invalid token
|
|
54
|
+
* req.user will be null
|
|
55
|
+
* @default false
|
|
56
|
+
*/
|
|
57
|
+
optional?: boolean;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,aAAa,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;IAE7C;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
|
|
@@ -1,34 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Auth
|
|
2
|
+
* Auth Types - SDK Friendly
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Clean, client-focused type names without DTO suffixes
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
|
-
* Login
|
|
7
|
+
* Login Credentials
|
|
8
8
|
*/
|
|
9
|
-
export interface
|
|
9
|
+
export interface LoginCredentials {
|
|
10
10
|
username: string;
|
|
11
11
|
password: string;
|
|
12
12
|
totp_token?: string;
|
|
13
13
|
backup_code?: string;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Authentication Session
|
|
17
|
+
* Result of successful login
|
|
17
18
|
*/
|
|
18
|
-
export interface
|
|
19
|
+
export interface AuthSession {
|
|
19
20
|
access_token: string;
|
|
20
21
|
refresh_token?: string;
|
|
21
22
|
expires_in?: number;
|
|
22
23
|
token_type?: string;
|
|
23
|
-
user:
|
|
24
|
+
user: User;
|
|
24
25
|
must_change_password?: boolean;
|
|
25
26
|
totp_required?: boolean;
|
|
26
27
|
message?: string;
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
|
-
* User Profile
|
|
30
|
+
* User Profile
|
|
31
|
+
* Complete user information with permissions and roles
|
|
30
32
|
*/
|
|
31
|
-
export interface
|
|
33
|
+
export interface User {
|
|
32
34
|
id: string;
|
|
33
35
|
email: string;
|
|
34
36
|
first_name: string;
|
|
@@ -59,15 +61,16 @@ export interface UserProfileResponseDto {
|
|
|
59
61
|
};
|
|
60
62
|
}
|
|
61
63
|
/**
|
|
62
|
-
* Token
|
|
64
|
+
* Refresh Token Request
|
|
63
65
|
*/
|
|
64
|
-
export interface
|
|
66
|
+
export interface RefreshTokenRequest {
|
|
65
67
|
refresh_token: string;
|
|
66
68
|
}
|
|
67
69
|
/**
|
|
68
|
-
*
|
|
70
|
+
* Authentication Tokens
|
|
71
|
+
* Result of token refresh
|
|
69
72
|
*/
|
|
70
|
-
export interface
|
|
73
|
+
export interface AuthTokens {
|
|
71
74
|
access_token: string;
|
|
72
75
|
refresh_token?: string;
|
|
73
76
|
expires_in?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../src/types/auth.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../src/types/auth.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/types/auth.types.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* File
|
|
2
|
+
* File Types - SDK Friendly
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Clean, client-focused type names without DTO suffixes
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
|
-
* File
|
|
7
|
+
* File Information
|
|
8
|
+
* Complete file metadata and URLs
|
|
8
9
|
*/
|
|
9
|
-
export interface
|
|
10
|
+
export interface File {
|
|
10
11
|
id: string;
|
|
11
12
|
created_at: string;
|
|
12
13
|
updated_at: string;
|
|
@@ -35,9 +36,10 @@ export interface FileResponseDto {
|
|
|
35
36
|
thumbnail_url?: string;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
|
-
* File Upload
|
|
39
|
+
* File Upload Options
|
|
40
|
+
* Configuration for uploading a file
|
|
39
41
|
*/
|
|
40
|
-
export interface
|
|
42
|
+
export interface FileUploadOptions {
|
|
41
43
|
entity_type: string;
|
|
42
44
|
entity_id: string;
|
|
43
45
|
entity_field?: string;
|
|
@@ -51,16 +53,18 @@ export interface FileUploadRequestDto {
|
|
|
51
53
|
size?: number;
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
54
|
-
* File Update
|
|
56
|
+
* File Update Data
|
|
57
|
+
* Fields that can be updated for a file
|
|
55
58
|
*/
|
|
56
|
-
export interface
|
|
59
|
+
export interface FileUpdateData {
|
|
57
60
|
description?: string;
|
|
58
61
|
is_public?: boolean;
|
|
59
62
|
metadata?: Record<string, any>;
|
|
60
63
|
entity_field?: string;
|
|
61
64
|
}
|
|
62
65
|
/**
|
|
63
|
-
* File Search
|
|
66
|
+
* File Search Parameters
|
|
67
|
+
* Options for searching and filtering files
|
|
64
68
|
*/
|
|
65
69
|
export interface FileSearchParams {
|
|
66
70
|
entity_type?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.types.d.ts","sourceRoot":"","sources":["../../src/types/file.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH
|
|
1
|
+
{"version":3,"file":"file.types.d.ts","sourceRoot":"","sources":["../../src/types/file.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC7B"}
|
package/dist/types/file.types.js
CHANGED