@cicctencent/midwayjs-base 1.0.34 → 1.0.36
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 +347 -1
- package/dist/types/config/config.default.d.ts +3 -0
- package/dist/types/config/config.default.js +171 -0
- package/dist/types/config/env.js +52 -0
- package/dist/{configuration.js → types/configuration.js} +44 -20
- package/dist/{filter → types/filter}/default.filter.js +1 -2
- package/dist/{filter → types/filter}/notfound.filter.js +1 -3
- package/dist/{guard → types/guard}/api.d.ts +0 -3
- package/dist/types/guard/api.js +77 -0
- package/dist/{guard → types/guard}/auth.d.ts +0 -3
- package/dist/types/guard/auth.js +182 -0
- package/dist/{index.js → types/index.js} +27 -6
- package/dist/types/lib/decorator.d.ts +6 -0
- package/dist/types/lib/decorator.js +48 -0
- package/dist/types/lib/jwt.d.ts +34 -0
- package/dist/types/lib/jwt.js +59 -0
- package/dist/{lib → types/lib}/request.d.ts +0 -5
- package/dist/{lib → types/lib}/request.js +1 -1
- package/dist/{lib → types/lib}/utils.d.ts +1 -7
- package/dist/types/lib/utils.js +78 -0
- package/dist/types/middleware/apiResultFormatter.d.ts +7 -0
- package/dist/types/middleware/apiResultFormatter.js +83 -0
- package/dist/types/middleware/detect.middleware.d.ts +4 -0
- package/dist/types/middleware/detect.middleware.js +58 -0
- package/dist/types/middleware/requestInit.d.ts +7 -0
- package/dist/types/middleware/requestInit.js +139 -0
- package/dist/types/service/session.service.d.ts +9 -0
- package/dist/types/service/session.service.js +56 -0
- package/dist/types/service/tencent.service.d.ts +37 -0
- package/dist/types/service/tencent.service.js +132 -0
- package/dist/types/{base.controller.js → types/base.controller.js} +1 -4
- package/dist/types/{base.model.service.d.ts → types/base.model.service.d.ts} +1 -9
- package/dist/types/types/base.model.service.js +76 -0
- package/dist/types/{base.service.d.ts → types/base.service.d.ts} +1 -10
- package/dist/types/types/base.service.js +70 -0
- package/dist/types/{session.service.interface.d.ts → types/session.service.interface.d.ts} +1 -15
- package/dist/types/{session.service.interface.js → types/session.service.interface.js} +1 -5
- package/package.json +4 -1
- package/dist/config/config.default.d.ts +0 -3
- package/dist/config/config.default.js +0 -160
- package/dist/config/env.js +0 -19
- package/dist/guard/api.js +0 -88
- package/dist/guard/auth.js +0 -201
- package/dist/lib/decorator.d.ts +0 -36
- package/dist/lib/decorator.js +0 -79
- package/dist/lib/jwt.d.ts +0 -135
- package/dist/lib/jwt.js +0 -38
- package/dist/lib/utils.js +0 -88
- package/dist/middleware/apiResultFormatter.d.ts +0 -8
- package/dist/middleware/apiResultFormatter.js +0 -84
- package/dist/middleware/detect.middleware.d.ts +0 -5
- package/dist/middleware/detect.middleware.js +0 -61
- package/dist/middleware/requestInit.d.ts +0 -8
- package/dist/middleware/requestInit.js +0 -100
- package/dist/service/session.service.d.ts +0 -33
- package/dist/service/session.service.js +0 -81
- package/dist/service/tencent.service.d.ts +0 -45
- package/dist/service/tencent.service.js +0 -105
- package/dist/types/base.model.service.js +0 -86
- package/dist/types/base.service.js +0 -86
- /package/dist/{config → types/config}/env.d.ts +0 -0
- /package/dist/{configuration.d.ts → types/configuration.d.ts} +0 -0
- /package/dist/{filter → types/filter}/default.filter.d.ts +0 -0
- /package/dist/{filter → types/filter}/notfound.filter.d.ts +0 -0
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
- /package/dist/types/{base.controller.d.ts → types/base.controller.d.ts} +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BaseService = void 0;
|
|
16
|
+
const core_1 = require("@midwayjs/core");
|
|
17
|
+
const api_1 = __importDefault(require("@fefeding/common/dist/utils/api"));
|
|
18
|
+
const request_1 = require("../lib/request");
|
|
19
|
+
class BaseService {
|
|
20
|
+
async checkManager(account = this.ctx.currentSession?.account?.account) {
|
|
21
|
+
return account && this.baseServiceOption.manager?.includes(account);
|
|
22
|
+
}
|
|
23
|
+
async requestBaseApi(req, option) {
|
|
24
|
+
const res = await this.requestBaseServer(req, option);
|
|
25
|
+
return res?.data || null;
|
|
26
|
+
}
|
|
27
|
+
async requestBaseServer(req, option) {
|
|
28
|
+
option = {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
baseURL: this.baseServiceOption.url,
|
|
31
|
+
accessKey: this.apiOption?.key || '',
|
|
32
|
+
...option,
|
|
33
|
+
};
|
|
34
|
+
const headers = option.headers || {};
|
|
35
|
+
if (option.accessKey) {
|
|
36
|
+
const thisToken = api_1.default.createApiToken(option.accessKey);
|
|
37
|
+
headers['x-api-token'] = thisToken.sign;
|
|
38
|
+
headers['x-api-timestamp'] = thisToken.timestamp;
|
|
39
|
+
}
|
|
40
|
+
headers['x-request-id'] = this.ctx.request_id;
|
|
41
|
+
headers['x-auth-token'] = this.ctx.currentSession?.id || '';
|
|
42
|
+
const ip = this.ctx?.detect?.CLIENTIP ||
|
|
43
|
+
(this.ctx.request?.header?.['x-client-ip'] ||
|
|
44
|
+
this.ctx.request?.header?.['x-forwarded-for'] ||
|
|
45
|
+
this.ctx.request?.ip ||
|
|
46
|
+
'').toString();
|
|
47
|
+
headers['x-client-ip'] = ip;
|
|
48
|
+
option.headers = headers;
|
|
49
|
+
const res = await (0, request_1.requestServer)(req, option);
|
|
50
|
+
return res;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.BaseService = BaseService;
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, core_1.App)(),
|
|
56
|
+
__metadata("design:type", Object)
|
|
57
|
+
], BaseService.prototype, "app", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, core_1.Inject)(),
|
|
60
|
+
__metadata("design:type", Object)
|
|
61
|
+
], BaseService.prototype, "ctx", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, core_1.Config)('baseService'),
|
|
64
|
+
__metadata("design:type", Object)
|
|
65
|
+
], BaseService.prototype, "baseServiceOption", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
(0, core_1.Config)('apiOption'),
|
|
68
|
+
__metadata("design:type", Object)
|
|
69
|
+
], BaseService.prototype, "apiOption", void 0);
|
|
70
|
+
//# sourceMappingURL=base.service.js.map
|
|
@@ -10,21 +10,7 @@ export declare abstract class ISessionService extends BaseService {
|
|
|
10
10
|
secretKey: string;
|
|
11
11
|
serviceKey: ObjectIdentifier;
|
|
12
12
|
};
|
|
13
|
-
|
|
14
|
-
* 根据ID获取session
|
|
15
|
-
* 并判断session是否在有效期
|
|
16
|
-
* @param id token唯一
|
|
17
|
-
*/
|
|
18
|
-
abstract getLoginSession(id: string): Promise<Session>;
|
|
19
|
-
/**
|
|
20
|
-
* 下线
|
|
21
|
-
* @param id 需要下线的id或者session
|
|
22
|
-
*/
|
|
13
|
+
abstract getLoginSession(id: string): Promise<Session | null>;
|
|
23
14
|
abstract logout(id: string): Promise<any>;
|
|
24
|
-
/**
|
|
25
|
-
* 用临时码登陆
|
|
26
|
-
* @param code 登陆临时码
|
|
27
|
-
* @returns
|
|
28
|
-
*/
|
|
29
15
|
abstract loginByCode(code: string): Promise<Session>;
|
|
30
16
|
}
|
|
@@ -10,15 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ISessionService = exports.DEFAULT_SESSION_SERVICE_KEY = void 0;
|
|
13
|
-
// @ts-ignore
|
|
14
13
|
const core_1 = require("@midwayjs/core");
|
|
15
14
|
const cache_manager_1 = require("@midwayjs/cache-manager");
|
|
16
15
|
const base_service_1 = require("./base.service");
|
|
17
|
-
// 定义服务标识符常量
|
|
18
16
|
exports.DEFAULT_SESSION_SERVICE_KEY = 'default:session:service';
|
|
19
17
|
class ISessionService extends base_service_1.BaseService {
|
|
20
|
-
sessionCache;
|
|
21
|
-
sessionOption;
|
|
22
18
|
}
|
|
23
19
|
exports.ISessionService = ISessionService;
|
|
24
20
|
__decorate([
|
|
@@ -29,4 +25,4 @@ __decorate([
|
|
|
29
25
|
(0, core_1.Config)('session'),
|
|
30
26
|
__metadata("design:type", Object)
|
|
31
27
|
], ISessionService.prototype, "sessionOption", void 0);
|
|
32
|
-
//# sourceMappingURL=
|
|
28
|
+
//# sourceMappingURL=session.service.interface.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cicctencent/midwayjs-base",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.36",
|
|
4
4
|
"description": "基础框架,服务",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -26,8 +26,11 @@
|
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@jest/globals": "^30.0.5",
|
|
28
28
|
"@midwayjs/mock": "^3.20.11",
|
|
29
|
+
"@types/ip": "^1.1.3",
|
|
29
30
|
"@types/jest": "^30.0.0",
|
|
31
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
30
32
|
"@types/koa": "^3.0.0",
|
|
33
|
+
"@types/lodash": "^4.17.23",
|
|
31
34
|
"@types/lodash-es": "^4.17.12",
|
|
32
35
|
"@types/node": "^24.3.0",
|
|
33
36
|
"cross-env": "^10.0.0",
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const path = require("path");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
exports.default = (appInfo) => {
|
|
6
|
-
appInfo.appId = Number(process.env.APP_ID) || 0;
|
|
7
|
-
const appRoot = appInfo.appDir || appInfo.root;
|
|
8
|
-
appInfo.dist = path.join(appRoot, 'dist');
|
|
9
|
-
appInfo.webDist = path.join(appInfo.dist, 'web');
|
|
10
|
-
appInfo.webPublic = path.join(appInfo.webDist, 'public');
|
|
11
|
-
if (!fs.existsSync(appInfo.webPublic)) {
|
|
12
|
-
fs.mkdirSync(appInfo.webPublic, {
|
|
13
|
-
recursive: true
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
const config = {
|
|
17
|
-
// use for cookie sign key, should change to your own and keep security
|
|
18
|
-
keys: appInfo.name + '_1641910879296_0612',
|
|
19
|
-
cookies: {
|
|
20
|
-
// 确保不设置secret,或者设置为空字符串
|
|
21
|
-
secret: '', // 如果为空字符串,则关闭加密,但仍然可以解密已加密的cookies
|
|
22
|
-
// ...
|
|
23
|
-
},
|
|
24
|
-
view: {
|
|
25
|
-
//默认view目录
|
|
26
|
-
defaultViewEngine: 'nunjucks',
|
|
27
|
-
//默认view目录,本地开发目录必须在web下的,正式环境则是根目录下的view,因为web目录会被删
|
|
28
|
-
rootDir: {
|
|
29
|
-
default: path.join(appInfo.webDist, 'view/'),
|
|
30
|
-
},
|
|
31
|
-
mapping: {
|
|
32
|
-
'.html': 'nunjucks',
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
// 上传配置
|
|
36
|
-
upload: {
|
|
37
|
-
// 文件模式
|
|
38
|
-
mode: 'file',
|
|
39
|
-
// 上传目录
|
|
40
|
-
fileSize: '10mb',
|
|
41
|
-
whitelist: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx'],
|
|
42
|
-
},
|
|
43
|
-
// 静态文件服务
|
|
44
|
-
staticFile: {
|
|
45
|
-
dirs: {
|
|
46
|
-
default: {
|
|
47
|
-
// 默认public目录
|
|
48
|
-
dir: appInfo.webPublic,
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
/**
|
|
53
|
-
* api相关配置
|
|
54
|
-
*/
|
|
55
|
-
apiOption: {
|
|
56
|
-
// 接口请求校验key
|
|
57
|
-
key: process.env.API_KEY || '2024@fefeding#',
|
|
58
|
-
reg: /^\/([^/]+\/)?api\//i,
|
|
59
|
-
ignore: [
|
|
60
|
-
'/',
|
|
61
|
-
/^\/([^/]+\/)?api\/cos\/get/i
|
|
62
|
-
]
|
|
63
|
-
},
|
|
64
|
-
// ip白名单
|
|
65
|
-
ipOption: {
|
|
66
|
-
whiteList: [
|
|
67
|
-
'127.0.0.1',
|
|
68
|
-
'::1',
|
|
69
|
-
'0.0.0.0',
|
|
70
|
-
'::',
|
|
71
|
-
'localhost',
|
|
72
|
-
...(process.env.IP_WHITE_LIST?.split(',') || [])
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
// 查看系统信息
|
|
76
|
-
info: {
|
|
77
|
-
infoPath: '/_sys_info',
|
|
78
|
-
},
|
|
79
|
-
axios: {
|
|
80
|
-
default: {
|
|
81
|
-
// 所有实例复用的配置
|
|
82
|
-
},
|
|
83
|
-
clients: {
|
|
84
|
-
// 默认实例的配置
|
|
85
|
-
default: {
|
|
86
|
-
// `headers` are custom headers to be sent
|
|
87
|
-
headers: {
|
|
88
|
-
'X-Requested-With': 'XMLHttpRequest',
|
|
89
|
-
},
|
|
90
|
-
timeout: 1000, // default is `0` (no timeout)
|
|
91
|
-
// `withCredentials` indicates whether or not cross-site Access-Control requests
|
|
92
|
-
// should be made using credentials
|
|
93
|
-
withCredentials: false, // default
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
// 基础服务
|
|
98
|
-
baseService: {
|
|
99
|
-
manager: ['admin'], // 管理员帐号
|
|
100
|
-
appId: appInfo.appId,
|
|
101
|
-
url: process.env.BASE_SERVER_URL || ''
|
|
102
|
-
},
|
|
103
|
-
session: {
|
|
104
|
-
// session 过期设置
|
|
105
|
-
timeout: Number(process.env.SESSION_TIMEOUT) || 20 * 60 * 1000,
|
|
106
|
-
secretKey: 'fjjiowhb@#$^111)*&',
|
|
107
|
-
//serviceKey: 'session:service',
|
|
108
|
-
},
|
|
109
|
-
// 登陆态校验配置
|
|
110
|
-
auth: {
|
|
111
|
-
// 忽略登陆态校验
|
|
112
|
-
ignores: [
|
|
113
|
-
/\/api\/test\//i,
|
|
114
|
-
"/api/test/action"
|
|
115
|
-
]
|
|
116
|
-
},
|
|
117
|
-
// 登陆相关配置
|
|
118
|
-
sso: {
|
|
119
|
-
baseUrl: process.env.SSO_URL || '',
|
|
120
|
-
appId: appInfo.appId,
|
|
121
|
-
},
|
|
122
|
-
tencentCredential: {
|
|
123
|
-
secretId: process.env.TENCENT_CREDENTIAL_SECRETID || '',
|
|
124
|
-
secretKey: process.env.TENCENT_CREDENTIAL_SECRETKEY || '',
|
|
125
|
-
},
|
|
126
|
-
busboy: {
|
|
127
|
-
mode: 'file',
|
|
128
|
-
},
|
|
129
|
-
bodyParser: {
|
|
130
|
-
formLimit: '30mb',
|
|
131
|
-
jsonLimit: '30mb',
|
|
132
|
-
},
|
|
133
|
-
cacheManager: {
|
|
134
|
-
clients: {
|
|
135
|
-
default: {
|
|
136
|
-
store: 'memory',
|
|
137
|
-
options: {
|
|
138
|
-
max: 10000, // 代表缓存 key 的最大个数
|
|
139
|
-
ttl: 600000, // 缓存的过期时间,单位毫秒。
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
session: {
|
|
144
|
-
store: 'memory',
|
|
145
|
-
options: {
|
|
146
|
-
max: 10000, // 代表缓存 key 的最大个数
|
|
147
|
-
ttl: 600000, // 缓存的过期时间,单位毫秒。
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
logger: {
|
|
152
|
-
// 日志配置
|
|
153
|
-
level: process.env.LOG_LEVEL || 'info',
|
|
154
|
-
consoleLevel: process.env.LOG_LEVEL || 'info',
|
|
155
|
-
remoteUrl: process.env.REMOTE_LOGGER_URL || '',
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
return config;
|
|
159
|
-
};
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUV6QixrQkFBZSxDQUFDLE9BQXNCLEVBQUUsRUFBRTtJQUN0QyxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDL0MsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV6RCxJQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDNUIsU0FBUyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHO1FBQ1gsdUVBQXVFO1FBQ3ZFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHLHFCQUFxQjtRQUMxQyxPQUFPLEVBQUU7WUFDTCx3QkFBd0I7WUFDeEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxtQ0FBbUM7WUFDL0MsTUFBTTtTQUNUO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsVUFBVTtZ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
|
package/dist/config/env.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadEnv = loadEnv;
|
|
4
|
-
const dotenv = require("dotenv");
|
|
5
|
-
const path = require("path");
|
|
6
|
-
const fs = require("fs");
|
|
7
|
-
function loadEnv(envPath) {
|
|
8
|
-
envPath = envPath || path.join(process.cwd(), '.env');
|
|
9
|
-
console.log('env path', envPath);
|
|
10
|
-
if (fs.existsSync(envPath)) {
|
|
11
|
-
const env = dotenv.config({
|
|
12
|
-
path: envPath,
|
|
13
|
-
encoding: 'utf-8'
|
|
14
|
-
});
|
|
15
|
-
console.log(env);
|
|
16
|
-
}
|
|
17
|
-
return process.env;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSwwQkFZQztBQWpCRCxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUd6QixTQUFnQixPQUFPLENBQUMsT0FBZ0I7SUFDcEMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqQyxJQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3RCLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLE9BQU87U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLENBQUMifQ==
|
package/dist/guard/api.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
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.ApiGuard = void 0;
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
const core_1 = require("@midwayjs/core");
|
|
15
|
-
const decorator_1 = require("../lib/decorator");
|
|
16
|
-
const api_1 = require("@fefeding/common/dist/utils/api");
|
|
17
|
-
/**
|
|
18
|
-
* 对于需要token的接口,从query或body或cookie中取token,是否跟本服务的一致
|
|
19
|
-
*/
|
|
20
|
-
let ApiGuard = class ApiGuard {
|
|
21
|
-
// 登陆态验证配置
|
|
22
|
-
apiOption;
|
|
23
|
-
ipOption;
|
|
24
|
-
async canActivate(context, supplierClz, methodName) {
|
|
25
|
-
// 检查是否有IP白名单限制
|
|
26
|
-
const needIP = (0, decorator_1.getCheckIP)(supplierClz, methodName);
|
|
27
|
-
if (needIP) {
|
|
28
|
-
//console.log('check ip ', needIP);
|
|
29
|
-
this.checkIPInWhiteList(context);
|
|
30
|
-
}
|
|
31
|
-
// 获取是否需要检查token
|
|
32
|
-
const needToken = (0, decorator_1.getApiToken)(supplierClz, methodName);
|
|
33
|
-
if (needToken) {
|
|
34
|
-
await this.checkApiToken(context);
|
|
35
|
-
}
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
// 校验是否有带api token
|
|
39
|
-
async checkApiToken(context) {
|
|
40
|
-
const body = (context.request.body || {});
|
|
41
|
-
const reqToken = context.URL.searchParams.get('api_token') ||
|
|
42
|
-
context.request.header['x-api-token'] ||
|
|
43
|
-
body.api_token ||
|
|
44
|
-
context.cookies.get('api_token');
|
|
45
|
-
const timestamp = Number(context.URL.searchParams.get('timestamp') ||
|
|
46
|
-
context.request.header['x-api-timestamp'] ||
|
|
47
|
-
body.timestamp ||
|
|
48
|
-
context.cookies.get('timestamp'));
|
|
49
|
-
if (!reqToken || !timestamp) {
|
|
50
|
-
context.logger.error(`token为空,非法请求, token: ${reqToken}, timestamp: ${timestamp}`);
|
|
51
|
-
throw Error('token为空,非法请求');
|
|
52
|
-
}
|
|
53
|
-
//const time = new Date(timestamp);
|
|
54
|
-
console.log('token time', reqToken, timestamp);
|
|
55
|
-
// 如果超过一定时间,则失效
|
|
56
|
-
if (timestamp < Date.now() - 5 * 60 * 1000) {
|
|
57
|
-
throw Error('timestamp已超过有效时间');
|
|
58
|
-
}
|
|
59
|
-
const thisToken = api_1.default.createApiToken(this.apiOption.key, timestamp);
|
|
60
|
-
if (reqToken !== thisToken.sign) {
|
|
61
|
-
context.logger.error(`输入token:${reqToken} 本地: ${thisToken.sign} 不一致`);
|
|
62
|
-
throw Error('token输入错误');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// 检查IP白名单
|
|
66
|
-
checkIPInWhiteList(context) {
|
|
67
|
-
const requestIp = context.detect?.REQUESTIP;
|
|
68
|
-
if (this.ipOption?.whiteList && !this.ipOption.whiteList.includes('*')) {
|
|
69
|
-
if (!this.ipOption.whiteList.includes(requestIp)) {
|
|
70
|
-
context.logger.error(`IP:${requestIp} 不在白名单内`);
|
|
71
|
-
throw Error(`IP:${requestIp} 不在白名单内`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
exports.ApiGuard = ApiGuard;
|
|
77
|
-
__decorate([
|
|
78
|
-
(0, core_1.Config)('apiOption'),
|
|
79
|
-
__metadata("design:type", Object)
|
|
80
|
-
], ApiGuard.prototype, "apiOption", void 0);
|
|
81
|
-
__decorate([
|
|
82
|
-
(0, core_1.Config)('ipOption'),
|
|
83
|
-
__metadata("design:type", Object)
|
|
84
|
-
], ApiGuard.prototype, "ipOption", void 0);
|
|
85
|
-
exports.ApiGuard = ApiGuard = __decorate([
|
|
86
|
-
(0, core_1.Guard)()
|
|
87
|
-
], ApiGuard);
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2d1YXJkL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxhQUFhO0FBQ2IseUNBQXVEO0FBRXZELGdEQUEyRDtBQUMzRCx5REFBa0Q7QUFFbEQ7O0dBRUc7QUFFSSxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVE7SUFDakIsVUFBVTtJQUVWLFNBQVMsQ0FFUDtJQUdGLFFBQVEsQ0FFTjtJQUVGLEtBQUssQ0FBQyxXQUFXLENBQ2IsT0FBZ0IsRUFDaEIsV0FBZ0IsRUFDaEIsVUFBa0I7UUFFbEIsZUFBZTtRQUNmLE1BQU0sTUFBTSxHQUFHLElBQUEsc0JBQVUsRUFBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBRyxNQUFNLEVBQUUsQ0FBQztZQUNSLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELGdCQUFnQjtRQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFBLHVCQUFXLEVBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZELElBQUksU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFnQjtRQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBUSxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTO1lBQ2QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTO1lBQ2QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQ3ZDLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLHdCQUF3QixRQUFRLGdCQUFnQixTQUFTLEVBQUUsQ0FDOUQsQ0FBQztZQUNGLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLGVBQWU7UUFDZixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxhQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEIsV0FBVyxRQUFRLFNBQVMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUNuRCxDQUFDO1lBQ0YsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO0lBQ1Ysa0JBQWtCLENBQUMsT0FBZ0I7UUFDL0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7UUFDNUMsSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxTQUFTLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLEtBQUssQ0FBQyxNQUFNLFNBQVMsU0FBUyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQWhGWSw0QkFBUTtBQUdqQjtJQURDLElBQUEsYUFBTSxFQUFDLFdBQVcsQ0FBQzs7MkNBR2xCO0FBR0Y7SUFEQyxJQUFBLGFBQU0sRUFBQyxVQUFVLENBQUM7OzBDQUdqQjttQkFWTyxRQUFRO0lBRHBCLElBQUEsWUFBSyxHQUFFO0dBQ0ssUUFBUSxDQWdGcEIifQ==
|
package/dist/guard/auth.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
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.AuthGuard = void 0;
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
const core_1 = require("@midwayjs/core");
|
|
15
|
-
const decorator_1 = require("../lib/decorator");
|
|
16
|
-
const utils_1 = require("../lib/utils");
|
|
17
|
-
const session_service_interface_1 = require("../types/session.service.interface");
|
|
18
|
-
/**
|
|
19
|
-
* 校验请求的登陆态
|
|
20
|
-
*/
|
|
21
|
-
let AuthGuard = class AuthGuard {
|
|
22
|
-
app;
|
|
23
|
-
sessionService;
|
|
24
|
-
ssoOption;
|
|
25
|
-
authOption;
|
|
26
|
-
apiOption;
|
|
27
|
-
koa;
|
|
28
|
-
async init() {
|
|
29
|
-
const appContext = this.app.getApplicationContext();
|
|
30
|
-
console.log('init auth guard');
|
|
31
|
-
// 如果用户自定义了session service的实现,则使用用户自定义的
|
|
32
|
-
this.sessionService = await appContext.getAsync(session_service_interface_1.DEFAULT_SESSION_SERVICE_KEY);
|
|
33
|
-
if (this.sessionService?.sessionOption?.serviceKey && this.sessionService?.sessionOption.serviceKey !== session_service_interface_1.DEFAULT_SESSION_SERVICE_KEY) {
|
|
34
|
-
//尝试获取用户自定义的实现
|
|
35
|
-
const sessionServiceObj = await appContext.getAsync(this.sessionService.sessionOption.serviceKey);
|
|
36
|
-
if (sessionServiceObj) {
|
|
37
|
-
console.log('use custom session service for auth guard', this.sessionService.sessionOption.serviceKey);
|
|
38
|
-
this.sessionService = sessionServiceObj;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// 检查是否需要验证登陆态
|
|
43
|
-
checkNeedAuth(context, supplierClz, methodName) {
|
|
44
|
-
// 如果有配置忽略验证,则直接返回false
|
|
45
|
-
if (this.authOption?.ignores) {
|
|
46
|
-
if (this.authOption.ignores === '*' || this.authOption.ignores === context.path) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
if (Array.isArray(this.authOption.ignores)) {
|
|
50
|
-
if (this.authOption.ignores.includes('*'))
|
|
51
|
-
return false;
|
|
52
|
-
for (const t of this.authOption.ignores) {
|
|
53
|
-
if (t instanceof RegExp) {
|
|
54
|
-
if (t.test(context.path))
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
else if (typeof t === 'string') {
|
|
58
|
-
if (t === context.path)
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// 获取是否需要检查登陆态
|
|
65
|
-
const needAuth = (0, decorator_1.getCheckLogin)(supplierClz, methodName);
|
|
66
|
-
return needAuth;
|
|
67
|
-
}
|
|
68
|
-
async canActivate(context, supplierClz, methodName) {
|
|
69
|
-
// 获取是否需要检查登陆态
|
|
70
|
-
const needAuth = this.checkNeedAuth(context, supplierClz, methodName);
|
|
71
|
-
const token = (0, utils_1.getAuthToken)(context);
|
|
72
|
-
if (token)
|
|
73
|
-
context.auth_token = token;
|
|
74
|
-
const ret = await this.checkAuth(context, token, needAuth);
|
|
75
|
-
return ret;
|
|
76
|
-
}
|
|
77
|
-
// 校验是否有带api token
|
|
78
|
-
async checkAuth(context, token, needAuth) {
|
|
79
|
-
this.sessionService.ctx = context;
|
|
80
|
-
const authRet = 50001;
|
|
81
|
-
//console.log('check auth', token, needAuth);
|
|
82
|
-
let errRes = null;
|
|
83
|
-
try {
|
|
84
|
-
let session = null;
|
|
85
|
-
// 如果是从登陆回来,则验证监时码
|
|
86
|
-
const authCode = context.URL.searchParams.get('auth_code');
|
|
87
|
-
if (authCode) {
|
|
88
|
-
session = await this.sessionService.loginByCode(authCode);
|
|
89
|
-
if (session) {
|
|
90
|
-
// 登陆写入cookie
|
|
91
|
-
(0, utils_1.setAuthToken)(context, session.id);
|
|
92
|
-
}
|
|
93
|
-
context.URL.searchParams.delete('auth_code'); // 移除auth_code参数
|
|
94
|
-
context.URL.hostname = context.detect?.HOSTNAME || context.hostname;
|
|
95
|
-
const url = context.URL.toString();
|
|
96
|
-
context.redirect(url);
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
if (token && !errRes && !session) {
|
|
100
|
-
// jwt签名
|
|
101
|
-
if (token.startsWith('Bearer ')) {
|
|
102
|
-
session = (0, utils_1.decodeJWT)(token.replace('Bearer ', ''), this.sessionService?.sessionOption?.secretKey || 'fefeding');
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
session = await this.sessionService.getLoginSession(token);
|
|
106
|
-
}
|
|
107
|
-
if (!session || !session.id) {
|
|
108
|
-
(0, utils_1.setAuthToken)(context, '');
|
|
109
|
-
//context.status = 403;
|
|
110
|
-
errRes = {
|
|
111
|
-
ret: authRet,
|
|
112
|
-
msg: 'token不存在或已过期',
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (!session) {
|
|
117
|
-
errRes = {
|
|
118
|
-
ret: authRet,
|
|
119
|
-
msg: '需要登陆态',
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
// 登陆态挂载到当前上下文
|
|
123
|
-
context.currentSession = session;
|
|
124
|
-
// @ts-ignore 登陆态挂载到logger
|
|
125
|
-
if (session && context.logger?.setOptions) {
|
|
126
|
-
// @ts-ignore
|
|
127
|
-
context.logger.setOptions({
|
|
128
|
-
loginId: session?.loginId || '',
|
|
129
|
-
userId: (session?.userId || '').toString(),
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (e) {
|
|
134
|
-
errRes = {
|
|
135
|
-
ret: e.ret || authRet,
|
|
136
|
-
msg: e.msg || e.message || 'auth error',
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
if (errRes && needAuth) {
|
|
140
|
-
this.authError(context, errRes);
|
|
141
|
-
}
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
// 异常处理
|
|
145
|
-
authError(context, error) {
|
|
146
|
-
const isApi = this.apiOption?.reg?.test(context.path);
|
|
147
|
-
if (isApi) {
|
|
148
|
-
context.status = 200;
|
|
149
|
-
context.res.write('', 'utf8');
|
|
150
|
-
throw error;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
const loginUrl = `${this.ssoOption?.baseUrl || this.koa?.globalPrefix || ''}/login`;
|
|
154
|
-
// 如果本来就以/login结尾,则直跳
|
|
155
|
-
if (!/\/login\/?(\?|$|#)/.test(context.URL.pathname)) {
|
|
156
|
-
const URL = context.URL;
|
|
157
|
-
if (context.detect?.HOSTNAME && URL.hostname !== context.detect?.HOSTNAME)
|
|
158
|
-
URL.hostname = context.detect.HOSTNAME;
|
|
159
|
-
URL.searchParams.delete('jv_auth_code');
|
|
160
|
-
URL.searchParams.delete('token');
|
|
161
|
-
URL.searchParams.delete('auth_code'); // 移除auth_code参数
|
|
162
|
-
const redirectUrl = context.URL.toString();
|
|
163
|
-
context.redirect(`${loginUrl}?url=${encodeURIComponent(redirectUrl)}&appid=${this.ssoOption?.appId || 0}`);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
context.redirect(loginUrl);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
exports.AuthGuard = AuthGuard;
|
|
172
|
-
__decorate([
|
|
173
|
-
(0, core_1.App)(),
|
|
174
|
-
__metadata("design:type", Object)
|
|
175
|
-
], AuthGuard.prototype, "app", void 0);
|
|
176
|
-
__decorate([
|
|
177
|
-
(0, core_1.Config)('sso'),
|
|
178
|
-
__metadata("design:type", Object)
|
|
179
|
-
], AuthGuard.prototype, "ssoOption", void 0);
|
|
180
|
-
__decorate([
|
|
181
|
-
(0, core_1.Config)('auth'),
|
|
182
|
-
__metadata("design:type", Object)
|
|
183
|
-
], AuthGuard.prototype, "authOption", void 0);
|
|
184
|
-
__decorate([
|
|
185
|
-
(0, core_1.Config)('apiOption'),
|
|
186
|
-
__metadata("design:type", Object)
|
|
187
|
-
], AuthGuard.prototype, "apiOption", void 0);
|
|
188
|
-
__decorate([
|
|
189
|
-
(0, core_1.Config)('koa'),
|
|
190
|
-
__metadata("design:type", Object)
|
|
191
|
-
], AuthGuard.prototype, "koa", void 0);
|
|
192
|
-
__decorate([
|
|
193
|
-
(0, core_1.Init)(),
|
|
194
|
-
__metadata("design:type", Function),
|
|
195
|
-
__metadata("design:paramtypes", []),
|
|
196
|
-
__metadata("design:returntype", Promise)
|
|
197
|
-
], AuthGuard.prototype, "init", null);
|
|
198
|
-
exports.AuthGuard = AuthGuard = __decorate([
|
|
199
|
-
(0, core_1.Guard)()
|
|
200
|
-
], AuthGuard);
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ndWFyZC9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLGFBQWE7QUFDYix5Q0FBMEU7QUFFMUUsZ0RBQWlEO0FBQ2pELHdDQUFxRTtBQUNyRSxrRkFBa0c7QUFFbEc7O0dBRUc7QUFFSSxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFFUixHQUFHLENBQWM7SUFFM0IsY0FBYyxDQUFrQjtJQUdoQyxTQUFTLENBQU07SUFHZixVQUFVLENBRVI7SUFHRixTQUFTLENBQU07SUFHZixHQUFHLENBQU07SUFHSCxBQUFOLEtBQUssQ0FBQyxJQUFJO1FBQ04sTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQWtCLHVEQUEyQixDQUFDLENBQUM7UUFDOUYsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsVUFBVSxLQUFLLHVEQUEyQixFQUFFLENBQUM7WUFDakksY0FBYztZQUNkLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFrQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuSCxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZHLElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7WUFDNUMsQ0FBQztRQUNM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
|