win-portal-auth-sdk 1.2.1 → 1.3.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 +102 -9
- package/dist/client/api/auth.api.d.ts +25 -1
- package/dist/client/api/auth.api.d.ts.map +1 -1
- package/dist/client/api/auth.api.js +30 -1
- package/dist/client/api/files.api.d.ts +0 -1
- package/dist/client/api/files.api.d.ts.map +1 -1
- package/dist/client/api/index.d.ts +2 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/client/api/index.js +3 -1
- package/dist/client/api/license.api.d.ts +74 -0
- package/dist/client/api/license.api.d.ts.map +1 -0
- package/dist/client/api/license.api.js +50 -0
- package/dist/client/api/system-config.api.d.ts +11 -1
- package/dist/client/api/system-config.api.d.ts.map +1 -1
- package/dist/client/api/system-config.api.js +21 -0
- package/dist/client/auth-client.d.ts +278 -1
- package/dist/client/auth-client.d.ts.map +1 -1
- package/dist/client/auth-client.js +705 -10
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/types/auth.types.d.ts +9 -0
- package/dist/types/auth.types.d.ts.map +1 -1
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/system-config.types.d.ts +37 -0
- package/dist/types/system-config.types.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/token-utils.d.ts +60 -0
- package/dist/utils/token-utils.d.ts.map +1 -0
- package/dist/utils/token-utils.js +116 -0
- package/package.json +1 -2
- package/TYPE_SAFETY.md +0 -97
package/dist/client/index.d.ts
CHANGED
|
@@ -2,4 +2,6 @@
|
|
|
2
2
|
* Client exports for frontend applications
|
|
3
3
|
*/
|
|
4
4
|
export { AuthClient } from './auth-client';
|
|
5
|
+
export type { RefreshTokenCallbacks, AutomaticRefreshOptions, SessionExpirationCallbacks, SessionExpirationOptions, InactivityCallbacks, InactivityDetectionOptions, } from './auth-client';
|
|
6
|
+
export * from './api';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,cAAc,OAAO,CAAC"}
|
package/dist/client/index.js
CHANGED
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Client exports for frontend applications
|
|
4
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
|
+
};
|
|
5
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
20
|
exports.AuthClient = void 0;
|
|
7
21
|
var auth_client_1 = require("./auth-client");
|
|
8
22
|
Object.defineProperty(exports, "AuthClient", { enumerable: true, get: function () { return auth_client_1.AuthClient; } });
|
|
23
|
+
__exportStar(require("./api"), exports);
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,9 +20,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
20
20
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.logger = void 0;
|
|
23
24
|
// Types
|
|
24
25
|
__exportStar(require("./types"), exports);
|
|
25
26
|
// Client (Frontend & Backend)
|
|
26
27
|
__exportStar(require("./client"), exports);
|
|
27
28
|
// Middleware (Backend only - Express & NestJS)
|
|
28
29
|
__exportStar(require("./middleware"), exports);
|
|
30
|
+
// Utils
|
|
31
|
+
__exportStar(require("./utils/token-utils"), exports);
|
|
32
|
+
var logger_1 = require("./utils/logger");
|
|
33
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
|
|
@@ -66,6 +66,15 @@ export interface User {
|
|
|
66
66
|
export interface RefreshTokenRequest {
|
|
67
67
|
refresh_token: string;
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Refresh Token Request with optional metadata
|
|
71
|
+
*/
|
|
72
|
+
export interface RefreshTokenRequestWithMetadata {
|
|
73
|
+
refresh_token: string;
|
|
74
|
+
ip_address?: string;
|
|
75
|
+
user_agent?: string;
|
|
76
|
+
device_id?: string;
|
|
77
|
+
}
|
|
69
78
|
/**
|
|
70
79
|
* Authentication Tokens
|
|
71
80
|
* Result of token refresh
|
|
@@ -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,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"}
|
|
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;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;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/index.d.ts
CHANGED
|
@@ -67,6 +67,24 @@ export interface AuthSdkConfig {
|
|
|
67
67
|
baseURL?: string;
|
|
68
68
|
apiKeyHeader?: string;
|
|
69
69
|
timeout?: number;
|
|
70
|
+
/**
|
|
71
|
+
* Advanced configuration options
|
|
72
|
+
* สำหรับปรับแต่ง internal behavior ของ SDK
|
|
73
|
+
*/
|
|
74
|
+
advanced?: {
|
|
75
|
+
/**
|
|
76
|
+
* Activity throttle time (milliseconds)
|
|
77
|
+
* ระยะเวลาที่ throttle activity handler เพื่อลด CPU usage
|
|
78
|
+
* Default: 1000ms (1 second)
|
|
79
|
+
*/
|
|
80
|
+
activityThrottleMs?: number;
|
|
81
|
+
/**
|
|
82
|
+
* Refresh token timeout (milliseconds)
|
|
83
|
+
* ระยะเวลาที่รอ refresh token request ก่อน timeout
|
|
84
|
+
* Default: 5000ms (5 seconds)
|
|
85
|
+
*/
|
|
86
|
+
refreshTimeoutMs?: number;
|
|
87
|
+
};
|
|
70
88
|
}
|
|
71
89
|
/**
|
|
72
90
|
* NestJS Module Configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IAGf,iBAAiB,EAAE,OAAO,CAAC;IAG3B,qBAAqB,EAAE,MAAM,CAAC;IAG9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;IAGtD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,CAAC;IAGlB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IAGf,iBAAiB,EAAE,OAAO,CAAC;IAG3B,qBAAqB,EAAE,MAAM,CAAC;IAG9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;IAGtD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,CAAC;IAGlB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE;QACT;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B;;;;WAIG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,cAAc,CAAC;AAG7B,cAAc,cAAc,CAAC;AAG7B,cAAc,uBAAuB,CAAC"}
|
|
@@ -29,4 +29,41 @@ export interface SystemConfig {
|
|
|
29
29
|
* Returns an object with key-value pairs for a category
|
|
30
30
|
*/
|
|
31
31
|
export type SystemConfigByCategory = Record<string, any>;
|
|
32
|
+
/**
|
|
33
|
+
* Security JWT Configuration
|
|
34
|
+
* Configuration for JWT token settings
|
|
35
|
+
*/
|
|
36
|
+
export interface SecurityJwtConfig {
|
|
37
|
+
jwt_secret: string;
|
|
38
|
+
access_token_expiry_minutes: number;
|
|
39
|
+
refresh_token_expiry_days: number;
|
|
40
|
+
automatic_refresh: boolean;
|
|
41
|
+
refresh_threshold_minutes: number;
|
|
42
|
+
rotate_refresh_token: boolean;
|
|
43
|
+
revoke_on_logout: boolean;
|
|
44
|
+
max_refresh_attempts: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Session Management Configuration
|
|
48
|
+
* Configuration for session timeout and expiration settings
|
|
49
|
+
*/
|
|
50
|
+
export interface SessionManagementConfig {
|
|
51
|
+
inactivity: {
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
timeout_duration: number;
|
|
54
|
+
timeout_unit: 'minutes' | 'hours' | 'days';
|
|
55
|
+
warning_minutes: number;
|
|
56
|
+
extend_on_activity: boolean;
|
|
57
|
+
};
|
|
58
|
+
lifetime: {
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
max_duration: number;
|
|
61
|
+
max_unit: 'minutes' | 'hours' | 'days';
|
|
62
|
+
};
|
|
63
|
+
concurrent: {
|
|
64
|
+
max_sessions: number;
|
|
65
|
+
logout_inactive: boolean;
|
|
66
|
+
show_badge: boolean;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
32
69
|
//# sourceMappingURL=system-config.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-config.types.d.ts","sourceRoot":"","sources":["../../src/types/system-config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"system-config.types.d.ts","sourceRoot":"","sources":["../../src/types/system-config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;QAC3C,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;KACxC,CAAC;IACF,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Utility
|
|
3
|
+
*
|
|
4
|
+
* @description Centralized logging utility for Auth SDK
|
|
5
|
+
* Supports different log levels and environment-based filtering
|
|
6
|
+
*/
|
|
7
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
8
|
+
interface LoggerConfig {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
logLevel: LogLevel;
|
|
11
|
+
}
|
|
12
|
+
declare class Logger {
|
|
13
|
+
private config;
|
|
14
|
+
private shouldLog;
|
|
15
|
+
debug(...args: any[]): void;
|
|
16
|
+
info(...args: any[]): void;
|
|
17
|
+
warn(...args: any[]): void;
|
|
18
|
+
error(...args: any[]): void;
|
|
19
|
+
setConfig(config: Partial<LoggerConfig>): void;
|
|
20
|
+
}
|
|
21
|
+
export declare const logger: Logger;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAGZ;IAEF,OAAO,CAAC,SAAS;IAUjB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;CAG/C;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger Utility
|
|
4
|
+
*
|
|
5
|
+
* @description Centralized logging utility for Auth SDK
|
|
6
|
+
* Supports different log levels and environment-based filtering
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.logger = void 0;
|
|
10
|
+
class Logger {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.config = {
|
|
13
|
+
enabled: true,
|
|
14
|
+
logLevel: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
shouldLog(level) {
|
|
18
|
+
if (!this.config.enabled)
|
|
19
|
+
return false;
|
|
20
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
21
|
+
const currentLevelIndex = levels.indexOf(this.config.logLevel);
|
|
22
|
+
const messageLevelIndex = levels.indexOf(level);
|
|
23
|
+
return messageLevelIndex >= currentLevelIndex;
|
|
24
|
+
}
|
|
25
|
+
debug(...args) {
|
|
26
|
+
if (this.shouldLog('debug')) {
|
|
27
|
+
console.log('[AuthClient]', ...args);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
info(...args) {
|
|
31
|
+
if (this.shouldLog('info')) {
|
|
32
|
+
console.log('[AuthClient]', ...args);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
warn(...args) {
|
|
36
|
+
if (this.shouldLog('warn')) {
|
|
37
|
+
console.warn('[AuthClient]', ...args);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
error(...args) {
|
|
41
|
+
if (this.shouldLog('error')) {
|
|
42
|
+
console.error('[AuthClient]', ...args);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
setConfig(config) {
|
|
46
|
+
this.config = { ...this.config, ...config };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.logger = new Logger();
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Utilities
|
|
3
|
+
*
|
|
4
|
+
* @description Utilities สำหรับจัดการ JWT tokens
|
|
5
|
+
* - Decode JWT payload
|
|
6
|
+
* - ตรวจสอบ token expiration
|
|
7
|
+
* - คำนวณเวลาที่เหลือก่อนหมดอายุ
|
|
8
|
+
*/
|
|
9
|
+
interface JwtPayload {
|
|
10
|
+
exp: number;
|
|
11
|
+
iat?: number;
|
|
12
|
+
sub?: string;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Decode JWT token (base64 decode only, ไม่ verify signature)
|
|
17
|
+
*
|
|
18
|
+
* @param token - JWT token string
|
|
19
|
+
* @returns Decoded payload หรือ null ถ้า decode ไม่ได้
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeJwt(token: string): JwtPayload | null;
|
|
22
|
+
/**
|
|
23
|
+
* ตรวจสอบว่า token หมดอายุหรือยัง
|
|
24
|
+
*
|
|
25
|
+
* @param token - JWT token string
|
|
26
|
+
* @returns true ถ้า token หมดอายุแล้ว
|
|
27
|
+
*/
|
|
28
|
+
export declare function isTokenExpired(token: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* คำนวณเวลาที่เหลือก่อน token หมดอายุ (เป็นนาที)
|
|
31
|
+
*
|
|
32
|
+
* @param token - JWT token string
|
|
33
|
+
* @returns จำนวนนาทีที่เหลือ หรือ null ถ้า decode ไม่ได้
|
|
34
|
+
*/
|
|
35
|
+
export declare function getTokenExpirationMinutes(token: string): number | null;
|
|
36
|
+
/**
|
|
37
|
+
* ตรวจสอบว่า token ใกล้หมดอายุหรือไม่ (ตาม threshold)
|
|
38
|
+
*
|
|
39
|
+
* @param token - JWT token string
|
|
40
|
+
* @param thresholdMinutes - จำนวนนาทีก่อนหมดอายุที่จะถือว่า "ใกล้หมดอายุ" (default: 5)
|
|
41
|
+
* @returns true ถ้า token ใกล้หมดอายุ
|
|
42
|
+
*/
|
|
43
|
+
export declare function isTokenNearExpiration(token: string, thresholdMinutes?: number): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* ตรวจสอบว่า token ยังใช้งานได้หรือไม่ (ยังไม่หมดอายุ)
|
|
46
|
+
*
|
|
47
|
+
* @param token - JWT token string
|
|
48
|
+
* @returns true ถ้า token ยังใช้งานได้
|
|
49
|
+
*/
|
|
50
|
+
export declare function isTokenValid(token: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* แปลง duration + unit เป็นนาที
|
|
53
|
+
*
|
|
54
|
+
* @param duration - จำนวน duration
|
|
55
|
+
* @param unit - หน่วยเวลา: 'minutes', 'hours', หรือ 'days'
|
|
56
|
+
* @returns จำนวนนาที
|
|
57
|
+
*/
|
|
58
|
+
export declare function convertDurationToMinutes(duration: number, unit: 'minutes' | 'hours' | 'days'): number;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=token-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../../src/utils/token-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASrD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYtE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAU,GAAG,OAAO,CAO1F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAWrG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Token Utilities
|
|
4
|
+
*
|
|
5
|
+
* @description Utilities สำหรับจัดการ JWT tokens
|
|
6
|
+
* - Decode JWT payload
|
|
7
|
+
* - ตรวจสอบ token expiration
|
|
8
|
+
* - คำนวณเวลาที่เหลือก่อนหมดอายุ
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.convertDurationToMinutes = exports.isTokenValid = exports.isTokenNearExpiration = exports.getTokenExpirationMinutes = exports.isTokenExpired = exports.decodeJwt = void 0;
|
|
12
|
+
/**
|
|
13
|
+
* Decode JWT token (base64 decode only, ไม่ verify signature)
|
|
14
|
+
*
|
|
15
|
+
* @param token - JWT token string
|
|
16
|
+
* @returns Decoded payload หรือ null ถ้า decode ไม่ได้
|
|
17
|
+
*/
|
|
18
|
+
function decodeJwt(token) {
|
|
19
|
+
try {
|
|
20
|
+
const parts = token.split('.');
|
|
21
|
+
if (parts.length !== 3) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
// Decode payload (second part)
|
|
25
|
+
const payload = parts[1];
|
|
26
|
+
// Support both browser and Node.js environments
|
|
27
|
+
const decoded = typeof window !== 'undefined'
|
|
28
|
+
? atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
|
|
29
|
+
: Buffer.from(payload.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf-8');
|
|
30
|
+
return JSON.parse(decoded);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('[TokenUtils] Failed to decode JWT:', error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.decodeJwt = decodeJwt;
|
|
38
|
+
/**
|
|
39
|
+
* ตรวจสอบว่า token หมดอายุหรือยัง
|
|
40
|
+
*
|
|
41
|
+
* @param token - JWT token string
|
|
42
|
+
* @returns true ถ้า token หมดอายุแล้ว
|
|
43
|
+
*/
|
|
44
|
+
function isTokenExpired(token) {
|
|
45
|
+
const payload = decodeJwt(token);
|
|
46
|
+
if (!payload || !payload.exp) {
|
|
47
|
+
return true; // ถ้า decode ไม่ได้หรือไม่มี exp ถือว่าหมดอายุ
|
|
48
|
+
}
|
|
49
|
+
const expirationTime = payload.exp * 1000; // Convert to milliseconds
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
return now >= expirationTime;
|
|
52
|
+
}
|
|
53
|
+
exports.isTokenExpired = isTokenExpired;
|
|
54
|
+
/**
|
|
55
|
+
* คำนวณเวลาที่เหลือก่อน token หมดอายุ (เป็นนาที)
|
|
56
|
+
*
|
|
57
|
+
* @param token - JWT token string
|
|
58
|
+
* @returns จำนวนนาทีที่เหลือ หรือ null ถ้า decode ไม่ได้
|
|
59
|
+
*/
|
|
60
|
+
function getTokenExpirationMinutes(token) {
|
|
61
|
+
const payload = decodeJwt(token);
|
|
62
|
+
if (!payload || !payload.exp) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const expirationTime = payload.exp * 1000; // Convert to milliseconds
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
const remainingMs = expirationTime - now;
|
|
68
|
+
const remainingMinutes = Math.floor(remainingMs / (1000 * 60));
|
|
69
|
+
return remainingMinutes;
|
|
70
|
+
}
|
|
71
|
+
exports.getTokenExpirationMinutes = getTokenExpirationMinutes;
|
|
72
|
+
/**
|
|
73
|
+
* ตรวจสอบว่า token ใกล้หมดอายุหรือไม่ (ตาม threshold)
|
|
74
|
+
*
|
|
75
|
+
* @param token - JWT token string
|
|
76
|
+
* @param thresholdMinutes - จำนวนนาทีก่อนหมดอายุที่จะถือว่า "ใกล้หมดอายุ" (default: 5)
|
|
77
|
+
* @returns true ถ้า token ใกล้หมดอายุ
|
|
78
|
+
*/
|
|
79
|
+
function isTokenNearExpiration(token, thresholdMinutes = 5) {
|
|
80
|
+
const remainingMinutes = getTokenExpirationMinutes(token);
|
|
81
|
+
if (remainingMinutes === null) {
|
|
82
|
+
return true; // ถ้า decode ไม่ได้ ถือว่าใกล้หมดอายุ
|
|
83
|
+
}
|
|
84
|
+
return remainingMinutes <= thresholdMinutes;
|
|
85
|
+
}
|
|
86
|
+
exports.isTokenNearExpiration = isTokenNearExpiration;
|
|
87
|
+
/**
|
|
88
|
+
* ตรวจสอบว่า token ยังใช้งานได้หรือไม่ (ยังไม่หมดอายุ)
|
|
89
|
+
*
|
|
90
|
+
* @param token - JWT token string
|
|
91
|
+
* @returns true ถ้า token ยังใช้งานได้
|
|
92
|
+
*/
|
|
93
|
+
function isTokenValid(token) {
|
|
94
|
+
return !isTokenExpired(token);
|
|
95
|
+
}
|
|
96
|
+
exports.isTokenValid = isTokenValid;
|
|
97
|
+
/**
|
|
98
|
+
* แปลง duration + unit เป็นนาที
|
|
99
|
+
*
|
|
100
|
+
* @param duration - จำนวน duration
|
|
101
|
+
* @param unit - หน่วยเวลา: 'minutes', 'hours', หรือ 'days'
|
|
102
|
+
* @returns จำนวนนาที
|
|
103
|
+
*/
|
|
104
|
+
function convertDurationToMinutes(duration, unit) {
|
|
105
|
+
switch (unit) {
|
|
106
|
+
case 'minutes':
|
|
107
|
+
return duration;
|
|
108
|
+
case 'hours':
|
|
109
|
+
return duration * 60;
|
|
110
|
+
case 'days':
|
|
111
|
+
return duration * 24 * 60;
|
|
112
|
+
default:
|
|
113
|
+
return duration; // fallback
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.convertDurationToMinutes = convertDurationToMinutes;
|
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "win-portal-auth-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Shared authentication SDK for Win Portal applications with JWT and OAuth support",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist",
|
|
9
9
|
"README.md",
|
|
10
|
-
"TYPE_SAFETY.md",
|
|
11
10
|
"LICENSE"
|
|
12
11
|
],
|
|
13
12
|
"repository": {
|
package/TYPE_SAFETY.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# Type Safety Guide
|
|
2
|
-
|
|
3
|
-
## Express Type Augmentation
|
|
4
|
-
|
|
5
|
-
The SDK automatically extends Express's `Request` interface to include auth properties.
|
|
6
|
-
|
|
7
|
-
### What's Included
|
|
8
|
-
|
|
9
|
-
```typescript
|
|
10
|
-
declare global {
|
|
11
|
-
namespace Express {
|
|
12
|
-
interface Request {
|
|
13
|
-
user?: UserProfileResponseDto | null;
|
|
14
|
-
token?: string | null;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### Usage
|
|
21
|
-
|
|
22
|
-
After installing the SDK, TypeScript will automatically recognize `req.user` and `req.token`:
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
import express from 'express';
|
|
26
|
-
import { authMiddleware } from 'win-portal-auth-sdk';
|
|
27
|
-
|
|
28
|
-
const app = express();
|
|
29
|
-
|
|
30
|
-
app.use(
|
|
31
|
-
authMiddleware({
|
|
32
|
-
baseURL: process.env.API_URL,
|
|
33
|
-
apiKey: process.env.API_KEY,
|
|
34
|
-
}),
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
app.get('/profile', (req, res) => {
|
|
38
|
-
// ✅ TypeScript knows about req.user
|
|
39
|
-
if (req.user) {
|
|
40
|
-
// ✅ Full IntelliSense for user properties
|
|
41
|
-
res.json({
|
|
42
|
-
email: req.user.email,
|
|
43
|
-
name: req.user.displayName,
|
|
44
|
-
permissions: req.user.permissions,
|
|
45
|
-
});
|
|
46
|
-
} else {
|
|
47
|
-
res.status(401).json({ error: 'Not authenticated' });
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### States
|
|
53
|
-
|
|
54
|
-
- `undefined` - Middleware not applied to this route
|
|
55
|
-
- `null` - Middleware applied but no token provided (when `optional: true`)
|
|
56
|
-
- `UserProfileResponseDto` - Successfully authenticated
|
|
57
|
-
|
|
58
|
-
### Helper Functions
|
|
59
|
-
|
|
60
|
-
For guaranteed non-null user:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
import { requireAuth } from 'win-portal-auth-sdk';
|
|
64
|
-
|
|
65
|
-
app.get('/protected', (req, res) => {
|
|
66
|
-
const { user } = requireAuth(req);
|
|
67
|
-
// ✅ user is guaranteed to be UserProfileResponseDto (not null)
|
|
68
|
-
res.json({ email: user.email });
|
|
69
|
-
});
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
For optional auth:
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
import { getAuth } from 'win-portal-auth-sdk';
|
|
76
|
-
|
|
77
|
-
app.get('/optional', (req, res) => {
|
|
78
|
-
const { user, token } = getAuth(req);
|
|
79
|
-
|
|
80
|
-
if (user) {
|
|
81
|
-
res.json({ authenticated: true, email: user.email });
|
|
82
|
-
} else {
|
|
83
|
-
res.json({ authenticated: false });
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Benefits
|
|
89
|
-
|
|
90
|
-
1. **IntelliSense** - Full autocomplete for `req.user` properties
|
|
91
|
-
2. **Type Safety** - Compile-time errors for typos
|
|
92
|
-
3. **Better DX** - No need to cast or assert types manually
|
|
93
|
-
4. **Standard Pattern** - Follows Express best practices
|
|
94
|
-
|
|
95
|
-
## No Express Dependency
|
|
96
|
-
|
|
97
|
-
The SDK does NOT depend on Express itself - it only augments the types when Express is present in your project. This keeps the SDK lightweight and flexible.
|