yingzios-platform-backend-shared 1.0.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 +51 -0
- package/dist/apollo/apollo.config.d.ts +26 -0
- package/dist/apollo/apollo.config.d.ts.map +1 -0
- package/dist/apollo/apollo.config.js +2 -0
- package/dist/apollo/apollo.module.d.ts +13 -0
- package/dist/apollo/apollo.module.d.ts.map +1 -0
- package/dist/apollo/apollo.module.js +61 -0
- package/dist/apollo/apollo.service.d.ts +17 -0
- package/dist/apollo/apollo.service.d.ts.map +1 -0
- package/dist/apollo/apollo.service.js +35 -0
- package/dist/apollo/index.d.ts +5 -0
- package/dist/apollo/index.d.ts.map +1 -0
- package/dist/apollo/index.js +17 -0
- package/dist/cache/cache.config.d.ts +28 -0
- package/dist/cache/cache.config.d.ts.map +1 -0
- package/dist/cache/cache.config.js +2 -0
- package/dist/cache/cache.module.d.ts +39 -0
- package/dist/cache/cache.module.d.ts.map +1 -0
- package/dist/cache/cache.module.js +75 -0
- package/dist/cache/cache.service.d.ts +49 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/cache.service.js +208 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +19 -0
- package/dist/env/env-loader.d.ts +50 -0
- package/dist/env/env-loader.d.ts.map +1 -0
- package/dist/env/env-loader.js +159 -0
- package/dist/env/env.module.d.ts +11 -0
- package/dist/env/env.module.d.ts.map +1 -0
- package/dist/env/env.module.js +47 -0
- package/dist/env/env.service.d.ts +31 -0
- package/dist/env/env.service.d.ts.map +1 -0
- package/dist/env/env.service.js +195 -0
- package/dist/env/index.d.ts +4 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +19 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/internal-auth/decorators/caller.decorator.d.ts +29 -0
- package/dist/internal-auth/decorators/caller.decorator.d.ts.map +1 -0
- package/dist/internal-auth/decorators/caller.decorator.js +37 -0
- package/dist/internal-auth/decorators/index.d.ts +3 -0
- package/dist/internal-auth/decorators/index.d.ts.map +1 -0
- package/dist/internal-auth/decorators/index.js +18 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.d.ts +31 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.d.ts.map +1 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.js +79 -0
- package/dist/internal-auth/guards/index.d.ts +2 -0
- package/dist/internal-auth/guards/index.d.ts.map +1 -0
- package/dist/internal-auth/guards/index.js +17 -0
- package/dist/internal-auth/guards/service-key.guard.d.ts +36 -0
- package/dist/internal-auth/guards/service-key.guard.d.ts.map +1 -0
- package/dist/internal-auth/guards/service-key.guard.js +86 -0
- package/dist/internal-auth/index.d.ts +43 -0
- package/dist/internal-auth/index.d.ts.map +1 -0
- package/dist/internal-auth/index.js +62 -0
- package/dist/internal-auth/internal-auth.module.d.ts +62 -0
- package/dist/internal-auth/internal-auth.module.d.ts.map +1 -0
- package/dist/internal-auth/internal-auth.module.js +118 -0
- package/dist/internal-auth/internal-http.service.d.ts +72 -0
- package/dist/internal-auth/internal-http.service.d.ts.map +1 -0
- package/dist/internal-auth/internal-http.service.js +119 -0
- package/dist/jwt/auto-fill-user.pipe.d.ts +43 -0
- package/dist/jwt/auto-fill-user.pipe.d.ts.map +1 -0
- package/dist/jwt/auto-fill-user.pipe.js +166 -0
- package/dist/jwt/decorators/current-user.decorator.d.ts +37 -0
- package/dist/jwt/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/jwt/decorators/current-user.decorator.js +29 -0
- package/dist/jwt/decorators/public.decorator.d.ts +8 -0
- package/dist/jwt/decorators/public.decorator.d.ts.map +1 -0
- package/dist/jwt/decorators/public.decorator.js +12 -0
- package/dist/jwt/guards/jwt-auth.guard.d.ts +20 -0
- package/dist/jwt/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/jwt/guards/jwt-auth.guard.js +88 -0
- package/dist/jwt/index.d.ts +8 -0
- package/dist/jwt/index.d.ts.map +1 -0
- package/dist/jwt/index.js +26 -0
- package/dist/jwt/jwt-config.service.d.ts +10 -0
- package/dist/jwt/jwt-config.service.d.ts.map +1 -0
- package/dist/jwt/jwt-config.service.js +40 -0
- package/dist/jwt/jwt.config.d.ts +15 -0
- package/dist/jwt/jwt.config.d.ts.map +1 -0
- package/dist/jwt/jwt.config.js +2 -0
- package/dist/jwt/jwt.module.d.ts +19 -0
- package/dist/jwt/jwt.module.d.ts.map +1 -0
- package/dist/jwt/jwt.module.js +100 -0
- package/dist/jwt/jwt.service.d.ts +31 -0
- package/dist/jwt/jwt.service.d.ts.map +1 -0
- package/dist/jwt/jwt.service.js +71 -0
- package/dist/jwt/strategies/jwt.strategy.d.ts +25 -0
- package/dist/jwt/strategies/jwt.strategy.d.ts.map +1 -0
- package/dist/jwt/strategies/jwt.strategy.js +150 -0
- package/dist/jwt/user-aware-axios.service.d.ts +17 -0
- package/dist/jwt/user-aware-axios.service.d.ts.map +1 -0
- package/dist/jwt/user-aware-axios.service.js +105 -0
- package/dist/jwt/utils/jwt.utils.d.ts +24 -0
- package/dist/jwt/utils/jwt.utils.d.ts.map +1 -0
- package/dist/jwt/utils/jwt.utils.js +40 -0
- package/dist/logger/index.d.ts +4 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +19 -0
- package/dist/logger/logger.config.d.ts +41 -0
- package/dist/logger/logger.config.d.ts.map +1 -0
- package/dist/logger/logger.config.js +13 -0
- package/dist/logger/logger.module.d.ts +17 -0
- package/dist/logger/logger.module.d.ts.map +1 -0
- package/dist/logger/logger.module.js +49 -0
- package/dist/logger/logger.service.d.ts +62 -0
- package/dist/logger/logger.service.d.ts.map +1 -0
- package/dist/logger/logger.service.js +124 -0
- package/dist/logger/winston.config.d.ts +43 -0
- package/dist/logger/winston.config.d.ts.map +1 -0
- package/dist/logger/winston.config.js +183 -0
- package/dist/nacos/index.d.ts +4 -0
- package/dist/nacos/index.d.ts.map +1 -0
- package/dist/nacos/index.js +19 -0
- package/dist/nacos/nacos.config.d.ts +10 -0
- package/dist/nacos/nacos.config.d.ts.map +1 -0
- package/dist/nacos/nacos.config.js +2 -0
- package/dist/nacos/nacos.module.d.ts +9 -0
- package/dist/nacos/nacos.module.d.ts.map +1 -0
- package/dist/nacos/nacos.module.js +42 -0
- package/dist/nacos/nacos.service.d.ts +43 -0
- package/dist/nacos/nacos.service.d.ts.map +1 -0
- package/dist/nacos/nacos.service.js +212 -0
- package/dist/nacos/utils.d.ts +10 -0
- package/dist/nacos/utils.d.ts.map +1 -0
- package/dist/nacos/utils.js +65 -0
- package/dist/restful/current-request.util.d.ts +16 -0
- package/dist/restful/current-request.util.d.ts.map +1 -0
- package/dist/restful/current-request.util.js +34 -0
- package/dist/restful/http-exception.filter.d.ts +24 -0
- package/dist/restful/http-exception.filter.d.ts.map +1 -0
- package/dist/restful/http-exception.filter.js +126 -0
- package/dist/restful/index.d.ts +8 -0
- package/dist/restful/index.d.ts.map +1 -0
- package/dist/restful/index.js +23 -0
- package/dist/restful/request-context.middleware.d.ts +6 -0
- package/dist/restful/request-context.middleware.d.ts.map +1 -0
- package/dist/restful/request-context.middleware.js +25 -0
- package/dist/restful/response-codes.d.ts +104 -0
- package/dist/restful/response-codes.d.ts.map +1 -0
- package/dist/restful/response-codes.js +163 -0
- package/dist/restful/response.dto.d.ts +52 -0
- package/dist/restful/response.dto.d.ts.map +1 -0
- package/dist/restful/response.dto.js +146 -0
- package/dist/restful/response.interceptor.d.ts +17 -0
- package/dist/restful/response.interceptor.d.ts.map +1 -0
- package/dist/restful/response.interceptor.js +86 -0
- package/dist/restful/restful.module.d.ts +5 -0
- package/dist/restful/restful.module.d.ts.map +1 -0
- package/dist/restful/restful.module.js +26 -0
- package/dist/sequelize/index.d.ts +4 -0
- package/dist/sequelize/index.d.ts.map +1 -0
- package/dist/sequelize/index.js +19 -0
- package/dist/sequelize/sequelize.config.d.ts +24 -0
- package/dist/sequelize/sequelize.config.d.ts.map +1 -0
- package/dist/sequelize/sequelize.config.js +5 -0
- package/dist/sequelize/sequelize.module.d.ts +28 -0
- package/dist/sequelize/sequelize.module.d.ts.map +1 -0
- package/dist/sequelize/sequelize.module.js +50 -0
- package/dist/sequelize/sequelize.provider.d.ts +7 -0
- package/dist/sequelize/sequelize.provider.d.ts.map +1 -0
- package/dist/sequelize/sequelize.provider.js +154 -0
- package/dist/snowflake/index.d.ts +4 -0
- package/dist/snowflake/index.d.ts.map +1 -0
- package/dist/snowflake/index.js +19 -0
- package/dist/snowflake/snowflake.config.d.ts +30 -0
- package/dist/snowflake/snowflake.config.d.ts.map +1 -0
- package/dist/snowflake/snowflake.config.js +12 -0
- package/dist/snowflake/snowflake.module.d.ts +17 -0
- package/dist/snowflake/snowflake.module.d.ts.map +1 -0
- package/dist/snowflake/snowflake.module.js +58 -0
- package/dist/snowflake/snowflake.service.d.ts +21 -0
- package/dist/snowflake/snowflake.service.d.ts.map +1 -0
- package/dist/snowflake/snowflake.service.js +44 -0
- package/dist/swagger/index.d.ts +6 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +19 -0
- package/dist/swagger/swagger.config.d.ts +45 -0
- package/dist/swagger/swagger.config.d.ts.map +1 -0
- package/dist/swagger/swagger.config.js +19 -0
- package/dist/swagger/swagger.decorators.d.ts +21 -0
- package/dist/swagger/swagger.decorators.d.ts.map +1 -0
- package/dist/swagger/swagger.decorators.js +112 -0
- package/dist/swagger/swagger.module.d.ts +15 -0
- package/dist/swagger/swagger.module.d.ts.map +1 -0
- package/dist/swagger/swagger.module.js +49 -0
- package/dist/swagger/swagger.service.d.ts +44 -0
- package/dist/swagger/swagger.service.d.ts.map +1 -0
- package/dist/swagger/swagger.service.js +202 -0
- package/package.json +75 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内部 HTTP 客户端配置
|
|
3
|
+
*/
|
|
4
|
+
export interface InternalHttpConfig {
|
|
5
|
+
/** 服务间调用密钥 */
|
|
6
|
+
serviceKey: string;
|
|
7
|
+
/** 请求超时时间(毫秒),默认 10000 */
|
|
8
|
+
timeout?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const INTERNAL_HTTP_CONFIG = "INTERNAL_HTTP_CONFIG";
|
|
11
|
+
/**
|
|
12
|
+
* 内部服务间调用请求选项
|
|
13
|
+
*/
|
|
14
|
+
export interface InternalRequestOptions {
|
|
15
|
+
/** 请求方法 */
|
|
16
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
17
|
+
/** 请求体 */
|
|
18
|
+
body?: any;
|
|
19
|
+
/** 额外请求头 */
|
|
20
|
+
headers?: Record<string, string>;
|
|
21
|
+
/** 超时时间(毫秒) */
|
|
22
|
+
timeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 内部服务间调用 HTTP 客户端
|
|
26
|
+
*
|
|
27
|
+
* 自动注入 X-Service-Key,简化服务间调用。
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // 在 service 中注入使用
|
|
32
|
+
* constructor(private readonly internalHttp: InternalHttpService) {}
|
|
33
|
+
*
|
|
34
|
+
* async getPlatformConfig() {
|
|
35
|
+
* return this.internalHttp.get('http://localhost:9005/portal/api/platform/internal/config');
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* async createRoute(data: any) {
|
|
39
|
+
* return this.internalHttp.post('http://platform-backend/portal/api/platform/routes', data);
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare class InternalHttpService {
|
|
44
|
+
private readonly serviceKey;
|
|
45
|
+
private readonly defaultTimeout;
|
|
46
|
+
constructor(config?: InternalHttpConfig);
|
|
47
|
+
/**
|
|
48
|
+
* 发起内部服务请求
|
|
49
|
+
*/
|
|
50
|
+
request<T = any>(url: string, options?: InternalRequestOptions): Promise<T>;
|
|
51
|
+
/**
|
|
52
|
+
* GET 请求
|
|
53
|
+
*/
|
|
54
|
+
get<T = any>(url: string, options?: Omit<InternalRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
55
|
+
/**
|
|
56
|
+
* POST 请求
|
|
57
|
+
*/
|
|
58
|
+
post<T = any>(url: string, body?: any, options?: Omit<InternalRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* PUT 请求
|
|
61
|
+
*/
|
|
62
|
+
put<T = any>(url: string, body?: any, options?: Omit<InternalRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
63
|
+
/**
|
|
64
|
+
* PATCH 请求
|
|
65
|
+
*/
|
|
66
|
+
patch<T = any>(url: string, body?: any, options?: Omit<InternalRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
67
|
+
/**
|
|
68
|
+
* DELETE 请求
|
|
69
|
+
*/
|
|
70
|
+
delete<T = any>(url: string, options?: Omit<InternalRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=internal-http.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-http.service.d.ts","sourceRoot":"","sources":["../../src/internal-auth/internal-http.service.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,UAAU;IACV,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBACa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAKtC,MAAM,CAAC,EAAE,kBAAkB;IAM7B;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,CAAC,CAAC;IA2CrF;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAItG;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAInH;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlH;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpH;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAG1G"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.InternalHttpService = exports.INTERNAL_HTTP_CONFIG = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
exports.INTERNAL_HTTP_CONFIG = 'INTERNAL_HTTP_CONFIG';
|
|
18
|
+
/**
|
|
19
|
+
* 内部服务间调用 HTTP 客户端
|
|
20
|
+
*
|
|
21
|
+
* 自动注入 X-Service-Key,简化服务间调用。
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // 在 service 中注入使用
|
|
26
|
+
* constructor(private readonly internalHttp: InternalHttpService) {}
|
|
27
|
+
*
|
|
28
|
+
* async getPlatformConfig() {
|
|
29
|
+
* return this.internalHttp.get('http://localhost:9005/portal/api/platform/internal/config');
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* async createRoute(data: any) {
|
|
33
|
+
* return this.internalHttp.post('http://platform-backend/portal/api/platform/routes', data);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
let InternalHttpService = class InternalHttpService {
|
|
38
|
+
serviceKey;
|
|
39
|
+
defaultTimeout;
|
|
40
|
+
constructor(config) {
|
|
41
|
+
this.serviceKey = config?.serviceKey || '';
|
|
42
|
+
this.defaultTimeout = config?.timeout || 10000;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 发起内部服务请求
|
|
46
|
+
*/
|
|
47
|
+
async request(url, options = {}) {
|
|
48
|
+
const headers = {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'X-Service-Key': this.serviceKey,
|
|
51
|
+
...options.headers,
|
|
52
|
+
};
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeout = options.timeout || this.defaultTimeout;
|
|
55
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(url, {
|
|
58
|
+
method: options.method || 'GET',
|
|
59
|
+
headers,
|
|
60
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
61
|
+
signal: controller.signal,
|
|
62
|
+
});
|
|
63
|
+
clearTimeout(timeoutId);
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const errorBody = await response.text();
|
|
66
|
+
throw new Error(`Internal service error: ${response.status} ${response.statusText} - ${errorBody}`);
|
|
67
|
+
}
|
|
68
|
+
const contentType = response.headers.get('content-type');
|
|
69
|
+
if (contentType?.includes('application/json')) {
|
|
70
|
+
return response.json();
|
|
71
|
+
}
|
|
72
|
+
return response.text();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
clearTimeout(timeoutId);
|
|
76
|
+
if (error.name === 'AbortError') {
|
|
77
|
+
throw new Error(`Internal service timeout: ${url} (${timeout}ms)`);
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* GET 请求
|
|
84
|
+
*/
|
|
85
|
+
async get(url, options) {
|
|
86
|
+
return this.request(url, { ...options, method: 'GET' });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* POST 请求
|
|
90
|
+
*/
|
|
91
|
+
async post(url, body, options) {
|
|
92
|
+
return this.request(url, { ...options, method: 'POST', body });
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* PUT 请求
|
|
96
|
+
*/
|
|
97
|
+
async put(url, body, options) {
|
|
98
|
+
return this.request(url, { ...options, method: 'PUT', body });
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* PATCH 请求
|
|
102
|
+
*/
|
|
103
|
+
async patch(url, body, options) {
|
|
104
|
+
return this.request(url, { ...options, method: 'PATCH', body });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* DELETE 请求
|
|
108
|
+
*/
|
|
109
|
+
async delete(url, options) {
|
|
110
|
+
return this.request(url, { ...options, method: 'DELETE' });
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
exports.InternalHttpService = InternalHttpService;
|
|
114
|
+
exports.InternalHttpService = InternalHttpService = __decorate([
|
|
115
|
+
(0, common_1.Injectable)(),
|
|
116
|
+
__param(0, (0, common_1.Optional)()),
|
|
117
|
+
__param(0, (0, common_1.Inject)(exports.INTERNAL_HTTP_CONFIG)),
|
|
118
|
+
__metadata("design:paramtypes", [Object])
|
|
119
|
+
], InternalHttpService);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PipeTransform, ArgumentMetadata } from '@nestjs/common';
|
|
2
|
+
import type { Request } from 'express';
|
|
3
|
+
import { ICurrentUser } from './decorators/current-user.decorator';
|
|
4
|
+
/**
|
|
5
|
+
* 自动填充 DTO 中的 createUser 字段的管道选项
|
|
6
|
+
*/
|
|
7
|
+
export interface AutoFillUserOptions {
|
|
8
|
+
/**
|
|
9
|
+
* 指定要填充的字段名,默认为 'createUser'
|
|
10
|
+
*/
|
|
11
|
+
field?: string;
|
|
12
|
+
/**
|
|
13
|
+
* 是否必须存在该字段,默认为 false
|
|
14
|
+
* 如果设置为 true 且字段不存在,则会抛出异常
|
|
15
|
+
*/
|
|
16
|
+
required?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 要填充的用户属性,默认为 'id'
|
|
19
|
+
* 可以是 'id', 'username', 'email' 等 ICurrentUser 接口中的任意属性
|
|
20
|
+
*/
|
|
21
|
+
property?: keyof ICurrentUser;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 自动填充 DTO 中的指定字段的管道工厂
|
|
25
|
+
* 创建一个 AutoFillUserPipe 实例
|
|
26
|
+
*/
|
|
27
|
+
export declare function AutoFillUserPipe(options?: AutoFillUserOptions | AutoFillUserOptions[]): {
|
|
28
|
+
new (request: Request): {
|
|
29
|
+
readonly request: Request;
|
|
30
|
+
transform(value: any, metadata: ArgumentMetadata): any;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 自动填充 DTO 中的指定字段的管道
|
|
35
|
+
* 当 DTO 中存在指定字段时,会自动使用当前用户信息填充该字段
|
|
36
|
+
*/
|
|
37
|
+
export declare class AutoFillUserPipeClass implements PipeTransform {
|
|
38
|
+
private readonly request;
|
|
39
|
+
private readonly options?;
|
|
40
|
+
constructor(request: Request, options?: AutoFillUserOptions | AutoFillUserOptions[]);
|
|
41
|
+
transform(value: any, metadata: ArgumentMetadata): any;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=auto-fill-user.pipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-fill-user.pipe.d.ts","sourceRoot":"","sources":["../../src/jwt/auto-fill-user.pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,gBAAgB,EAAiB,MAAM,gBAAgB,CAAC;AAE5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;kBAG5B,OAAO;0BAAP,OAAO;yBAE5C,GAAG,YAAY,gBAAgB;;EAuEnD;AAED;;;GAGG;AACH,qBACa,qBAAsB,YAAW,aAAa;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBADS,OAAO,EAAE,OAAO,EACjC,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAGxE,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB;CAsEjD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AutoFillUserPipeClass = void 0;
|
|
16
|
+
exports.AutoFillUserPipe = AutoFillUserPipe;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const core_1 = require("@nestjs/core");
|
|
19
|
+
/**
|
|
20
|
+
* 自动填充 DTO 中的指定字段的管道工厂
|
|
21
|
+
* 创建一个 AutoFillUserPipe 实例
|
|
22
|
+
*/
|
|
23
|
+
function AutoFillUserPipe(options) {
|
|
24
|
+
let NamedAutoFillUserPipe = class NamedAutoFillUserPipe {
|
|
25
|
+
request;
|
|
26
|
+
constructor(request) {
|
|
27
|
+
this.request = request;
|
|
28
|
+
}
|
|
29
|
+
transform(value, metadata) {
|
|
30
|
+
// 只处理 body 类型的数据
|
|
31
|
+
if (metadata.type !== 'body') {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
// 如果值不存在或者不是对象,则直接返回
|
|
35
|
+
if (!value || typeof value !== 'object') {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
// 标准化为数组形式便于统一处理
|
|
39
|
+
const optionsArray = Array.isArray(options) ? options : options ? [options] : [];
|
|
40
|
+
// 如果没有配置项,则直接返回原值
|
|
41
|
+
if (optionsArray.length === 0) {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
let result = { ...value };
|
|
45
|
+
// 遍历所有配置项进行处理
|
|
46
|
+
for (const option of optionsArray) {
|
|
47
|
+
// 获取要填充的字段名,默认为 'createUser'
|
|
48
|
+
const field = option.field || 'createUser';
|
|
49
|
+
// 获取要填充的用户属性,默认为 'id'
|
|
50
|
+
const property = option.property || 'id';
|
|
51
|
+
// // 检查是否存在该字段
|
|
52
|
+
// if (!(field in result)) {
|
|
53
|
+
// // 如果字段是必需的但不存在,则抛出异常
|
|
54
|
+
// if (option.required) {
|
|
55
|
+
// throw new Error(
|
|
56
|
+
// `Field '${field}' is required but not present in the DTO`,
|
|
57
|
+
// );
|
|
58
|
+
// }
|
|
59
|
+
// // 如果字段不是必需的且不存在,则跳过处理下一个字段
|
|
60
|
+
// continue;
|
|
61
|
+
// }
|
|
62
|
+
// 如果字段存在,但值已经设置,则跳过处理下一个字段
|
|
63
|
+
if (result[field] !== undefined && result[field] !== null) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// 获取当前用户信息
|
|
67
|
+
const user = this.request.user;
|
|
68
|
+
if (!user) {
|
|
69
|
+
// 如果没有用户信息,则跳过处理下一个字段
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// 检查用户对象是否有指定的属性
|
|
73
|
+
if (!(property in user)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// 填充用户信息到指定字段
|
|
77
|
+
result = {
|
|
78
|
+
...result,
|
|
79
|
+
[field]: user[property],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
NamedAutoFillUserPipe = __decorate([
|
|
86
|
+
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
|
|
87
|
+
__param(0, (0, common_1.Inject)(core_1.REQUEST)),
|
|
88
|
+
__metadata("design:paramtypes", [Object])
|
|
89
|
+
], NamedAutoFillUserPipe);
|
|
90
|
+
return NamedAutoFillUserPipe;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 自动填充 DTO 中的指定字段的管道
|
|
94
|
+
* 当 DTO 中存在指定字段时,会自动使用当前用户信息填充该字段
|
|
95
|
+
*/
|
|
96
|
+
let AutoFillUserPipeClass = class AutoFillUserPipeClass {
|
|
97
|
+
request;
|
|
98
|
+
options;
|
|
99
|
+
constructor(request, options) {
|
|
100
|
+
this.request = request;
|
|
101
|
+
this.options = options;
|
|
102
|
+
}
|
|
103
|
+
transform(value, metadata) {
|
|
104
|
+
// 只处理 body 类型的数据
|
|
105
|
+
if (metadata.type !== 'body') {
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
// 如果值不存在或者不是对象,则直接返回
|
|
109
|
+
if (!value || typeof value !== 'object') {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
// 标准化为数组形式便于统一处理
|
|
113
|
+
const optionsArray = Array.isArray(this.options)
|
|
114
|
+
? this.options
|
|
115
|
+
: this.options
|
|
116
|
+
? [this.options]
|
|
117
|
+
: [];
|
|
118
|
+
// 如果没有配置项,则直接返回原值
|
|
119
|
+
if (optionsArray.length === 0) {
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
let result = { ...value };
|
|
123
|
+
// 遍历所有配置项进行处理
|
|
124
|
+
for (const option of optionsArray) {
|
|
125
|
+
// 获取要填充的字段名,默认为 'createUser'
|
|
126
|
+
const field = option.field || 'createUser';
|
|
127
|
+
// 获取要填充的用户属性,默认为 'id'
|
|
128
|
+
const property = option.property || 'id';
|
|
129
|
+
// 检查是否存在该字段
|
|
130
|
+
if (!(field in result)) {
|
|
131
|
+
// 如果字段是必需的但不存在,则抛出异常
|
|
132
|
+
if (option.required) {
|
|
133
|
+
throw new Error(`Field '${field}' is required but not present in the DTO`);
|
|
134
|
+
}
|
|
135
|
+
// 如果字段不是必需的且不存在,则跳过处理下一个字段
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// 如果字段存在,但值已经设置,则跳过处理下一个字段
|
|
139
|
+
if (result[field] !== undefined && result[field] !== null) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// 获取当前用户信息
|
|
143
|
+
const user = this.request.user;
|
|
144
|
+
if (!user) {
|
|
145
|
+
// 如果没有用户信息,则跳过处理下一个字段
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// 检查用户对象是否有指定的属性
|
|
149
|
+
if (!(property in user)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// 填充用户信息到指定字段
|
|
153
|
+
result = {
|
|
154
|
+
...result,
|
|
155
|
+
[field]: user[property],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
exports.AutoFillUserPipeClass = AutoFillUserPipeClass;
|
|
162
|
+
exports.AutoFillUserPipeClass = AutoFillUserPipeClass = __decorate([
|
|
163
|
+
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
|
|
164
|
+
__param(0, (0, common_1.Inject)(core_1.REQUEST)),
|
|
165
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
166
|
+
], AutoFillUserPipeClass);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户角色枚举
|
|
3
|
+
* 定义在JWT模块中
|
|
4
|
+
*/
|
|
5
|
+
export declare enum UserRole {
|
|
6
|
+
ADMIN = "admin",
|
|
7
|
+
USER = "user",
|
|
8
|
+
GUEST = "guest"
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 当前用户接口
|
|
12
|
+
* 定义在JWT模块中
|
|
13
|
+
*/
|
|
14
|
+
export interface ICurrentUser {
|
|
15
|
+
id: string;
|
|
16
|
+
username: string;
|
|
17
|
+
email: string;
|
|
18
|
+
role: UserRole;
|
|
19
|
+
isActive: boolean;
|
|
20
|
+
lastLoginAt?: Date;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
updatedAt: Date;
|
|
23
|
+
nickname?: string;
|
|
24
|
+
avatar?: string;
|
|
25
|
+
phone?: string;
|
|
26
|
+
orgId?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 当前用户装饰器
|
|
30
|
+
* 用于在控制器中获取当前认证的用户
|
|
31
|
+
*/
|
|
32
|
+
export declare const CurrentUser: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
33
|
+
/**
|
|
34
|
+
* 获取用户ID装饰器
|
|
35
|
+
*/
|
|
36
|
+
export declare const UserId: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
37
|
+
//# sourceMappingURL=current-user.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user.decorator.d.ts","sourceRoot":"","sources":["../../../src/jwt/decorators/current-user.decorator.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAEhB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,mDAKvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,mDAGjB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserId = exports.CurrentUser = exports.UserRole = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
/**
|
|
6
|
+
* 用户角色枚举
|
|
7
|
+
* 定义在JWT模块中
|
|
8
|
+
*/
|
|
9
|
+
var UserRole;
|
|
10
|
+
(function (UserRole) {
|
|
11
|
+
UserRole["ADMIN"] = "admin";
|
|
12
|
+
UserRole["USER"] = "user";
|
|
13
|
+
UserRole["GUEST"] = "guest";
|
|
14
|
+
})(UserRole || (exports.UserRole = UserRole = {}));
|
|
15
|
+
/**
|
|
16
|
+
* 当前用户装饰器
|
|
17
|
+
* 用于在控制器中获取当前认证的用户
|
|
18
|
+
*/
|
|
19
|
+
exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
20
|
+
const request = ctx.switchToHttp().getRequest();
|
|
21
|
+
return request.user;
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* 获取用户ID装饰器
|
|
25
|
+
*/
|
|
26
|
+
exports.UserId = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
27
|
+
const request = ctx.switchToHttp().getRequest();
|
|
28
|
+
return request.user?.id;
|
|
29
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.decorator.d.ts","sourceRoot":"","sources":["../../../src/jwt/decorators/public.decorator.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,MAAM,wDAAyC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Public = exports.IS_PUBLIC_KEY = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
/**
|
|
6
|
+
* 公开路由装饰器
|
|
7
|
+
* 用于标记不需要JWT认证的路由
|
|
8
|
+
* 注意:这个装饰器只对JwtAuthGuard有效
|
|
9
|
+
*/
|
|
10
|
+
exports.IS_PUBLIC_KEY = 'isPublic';
|
|
11
|
+
const Public = () => (0, common_1.SetMetadata)(exports.IS_PUBLIC_KEY, true);
|
|
12
|
+
exports.Public = Public;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { JwtConfigService } from '../jwt-config.service';
|
|
4
|
+
declare const JwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
5
|
+
/**
|
|
6
|
+
* JWT认证守卫
|
|
7
|
+
* 检查请求是否包含有效的JWT令牌
|
|
8
|
+
* 支持 @Public() 装饰器标记公开路由
|
|
9
|
+
* 当 isOptionalAuth 为 true 时,如果请求中有token则解析用户信息,没有则继续执行但用户信息为null
|
|
10
|
+
*/
|
|
11
|
+
export declare class JwtAuthGuard extends JwtAuthGuard_base {
|
|
12
|
+
private reflector;
|
|
13
|
+
private jwtConfigService;
|
|
14
|
+
constructor(reflector: Reflector, jwtConfigService: JwtConfigService);
|
|
15
|
+
canActivate(context: ExecutionContext): boolean | Promise<boolean> | import("rxjs").Observable<boolean>;
|
|
16
|
+
handleRequest(err: any, user: any, info: any, context: ExecutionContext): any;
|
|
17
|
+
private handleOptionalAuth;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=jwt-auth.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-auth.guard.d.ts","sourceRoot":"","sources":["../../../src/jwt/guards/jwt-auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;;AAEzD;;;;;GAKG;AACH,qBACa,YAAa,SAAQ,iBAAgB;IAE9C,OAAO,CAAC,SAAS;IAEjB,OAAO,CAAC,gBAAgB;gBAFhB,SAAS,EAAE,SAAS,EAEpB,gBAAgB,EAAE,gBAAgB;IAK5C,WAAW,CAAC,OAAO,EAAE,gBAAgB;IAsBrC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;YAsBzD,kBAAkB;CAajC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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 passport_1 = require("@nestjs/passport");
|
|
15
|
+
const core_1 = require("@nestjs/core");
|
|
16
|
+
const public_decorator_1 = require("../decorators/public.decorator");
|
|
17
|
+
const jwt_config_service_1 = require("../jwt-config.service");
|
|
18
|
+
/**
|
|
19
|
+
* JWT认证守卫
|
|
20
|
+
* 检查请求是否包含有效的JWT令牌
|
|
21
|
+
* 支持 @Public() 装饰器标记公开路由
|
|
22
|
+
* 当 isOptionalAuth 为 true 时,如果请求中有token则解析用户信息,没有则继续执行但用户信息为null
|
|
23
|
+
*/
|
|
24
|
+
let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') {
|
|
25
|
+
reflector;
|
|
26
|
+
jwtConfigService;
|
|
27
|
+
constructor(reflector,
|
|
28
|
+
// 因为Guard里面不能直接使用 JWT_CONFIGS ,引入一个配置服务
|
|
29
|
+
jwtConfigService) {
|
|
30
|
+
super();
|
|
31
|
+
this.reflector = reflector;
|
|
32
|
+
this.jwtConfigService = jwtConfigService;
|
|
33
|
+
}
|
|
34
|
+
canActivate(context) {
|
|
35
|
+
// 检查路由是否标记为公开
|
|
36
|
+
const isPublic = this.reflector.getAllAndOverride(public_decorator_1.IS_PUBLIC_KEY, [
|
|
37
|
+
context.getHandler(),
|
|
38
|
+
context.getClass(),
|
|
39
|
+
]);
|
|
40
|
+
// 如果是公开路由,允许访问
|
|
41
|
+
if (isPublic) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
// 检查是否为可选认证模式
|
|
45
|
+
if (this.jwtConfigService.isOptionalAuth) {
|
|
46
|
+
// 在可选认证模式下,我们尝试认证,但即使失败也允许访问
|
|
47
|
+
return this.handleOptionalAuth(context);
|
|
48
|
+
}
|
|
49
|
+
// 否则执行标准JWT认证
|
|
50
|
+
return super.canActivate(context);
|
|
51
|
+
}
|
|
52
|
+
handleRequest(err, user, info, context) {
|
|
53
|
+
console.log('[JwtAuthGuard.handleRequest] err:', err?.message || null, 'user:', !!user, 'info:', info?.message || info?.name || null);
|
|
54
|
+
// 调用父类的处理方法
|
|
55
|
+
const request = context.switchToHttp().getRequest();
|
|
56
|
+
const result = super.handleRequest(err, user, info, context);
|
|
57
|
+
console.log('[JwtAuthGuard.handleRequest] result:', !!result, 'userId:', result?.id);
|
|
58
|
+
// 如果用户认证成功,将用户信息冗余到请求头中
|
|
59
|
+
if (result && result.id) {
|
|
60
|
+
// 将用户ID和用户名添加到请求头中
|
|
61
|
+
request.headers['operator'] = result.id;
|
|
62
|
+
request.headers['operatorname'] = result.username || '';
|
|
63
|
+
// 也可以添加一个标记,表示token验证成功
|
|
64
|
+
request.headers['valid_token_successed'] = 'true';
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
async handleOptionalAuth(context) {
|
|
69
|
+
try {
|
|
70
|
+
// 尝试进行JWT认证,这会将用户信息添加到请求对象中
|
|
71
|
+
await super.canActivate(context);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// 在可选认证模式下,即使认证失败也允许访问
|
|
76
|
+
// 但仍然需要将request对象设置为无用户信息
|
|
77
|
+
const request = context.switchToHttp().getRequest();
|
|
78
|
+
request.user = null;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.JwtAuthGuard = JwtAuthGuard;
|
|
84
|
+
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
85
|
+
(0, common_1.Injectable)(),
|
|
86
|
+
__metadata("design:paramtypes", [core_1.Reflector,
|
|
87
|
+
jwt_config_service_1.JwtConfigService])
|
|
88
|
+
], JwtAuthGuard);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './jwt.module';
|
|
2
|
+
export * from './jwt.service';
|
|
3
|
+
export * from './user-aware-axios.service';
|
|
4
|
+
export * from './decorators/current-user.decorator';
|
|
5
|
+
export * from './decorators/public.decorator';
|
|
6
|
+
export * from './guards/jwt-auth.guard';
|
|
7
|
+
export { AutoFillUserPipe } from './auto-fill-user.pipe';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jwt/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AAGxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
exports.AutoFillUserPipe = void 0;
|
|
18
|
+
__exportStar(require("./jwt.module"), exports);
|
|
19
|
+
__exportStar(require("./jwt.service"), exports);
|
|
20
|
+
__exportStar(require("./user-aware-axios.service"), exports);
|
|
21
|
+
__exportStar(require("./decorators/current-user.decorator"), exports);
|
|
22
|
+
__exportStar(require("./decorators/public.decorator"), exports);
|
|
23
|
+
__exportStar(require("./guards/jwt-auth.guard"), exports);
|
|
24
|
+
// export * from './strategies/jwt.strategy';
|
|
25
|
+
var auto_fill_user_pipe_1 = require("./auto-fill-user.pipe");
|
|
26
|
+
Object.defineProperty(exports, "AutoFillUserPipe", { enumerable: true, get: function () { return auto_fill_user_pipe_1.AutoFillUserPipe; } });
|