sumor 3.1.4 → 3.1.6
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 +0 -8
- package/dist/web/OAuthStore.d.ts +19 -0
- package/dist/web/OAuthStore.d.ts.map +1 -1
- package/dist/web/OAuthStore.js +32 -0
- package/dist/web/OAuthStore.js.map +1 -1
- package/dist/web/api/hasPermission.d.ts +12 -0
- package/dist/web/api/hasPermission.d.ts.map +1 -0
- package/dist/web/api/hasPermission.js +26 -0
- package/dist/web/api/hasPermission.js.map +1 -0
- package/dist/web/api/hasRole.d.ts +7 -0
- package/dist/web/api/hasRole.d.ts.map +1 -0
- package/dist/web/api/hasRole.js +15 -0
- package/dist/web/api/hasRole.js.map +1 -0
- package/dist/web/api/login.d.ts +5 -0
- package/dist/web/api/login.d.ts.map +1 -0
- package/dist/web/api/login.js +14 -0
- package/dist/web/api/login.js.map +1 -0
- package/dist/web/api/logout.d.ts +5 -0
- package/dist/web/api/logout.d.ts.map +1 -0
- package/dist/web/api/logout.js +19 -0
- package/dist/web/api/logout.js.map +1 -0
- package/dist/web/api/refreshToken.d.ts +7 -0
- package/dist/web/api/refreshToken.d.ts.map +1 -0
- package/dist/web/api/refreshToken.js +37 -0
- package/dist/web/api/refreshToken.js.map +1 -0
- package/dist/web/axiosInstance.d.ts +7 -0
- package/dist/web/axiosInstance.d.ts.map +1 -0
- package/dist/web/axiosInstance.js +94 -0
- package/dist/web/axiosInstance.js.map +1 -0
- package/dist/web/index.d.ts +7 -3
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +9 -14
- package/dist/web/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/Sumor.d.ts +0 -71
- package/dist/web/Sumor.d.ts.map +0 -1
- package/dist/web/Sumor.js +0 -244
- package/dist/web/Sumor.js.map +0 -1
package/README.md
CHANGED
|
@@ -266,14 +266,6 @@ await window.sumor.refresh()
|
|
|
266
266
|
await window.sumor.refresh(true)
|
|
267
267
|
```
|
|
268
268
|
|
|
269
|
-
#### refreshConfig()
|
|
270
|
-
|
|
271
|
-
Manually refresh configuration (same as `refresh(true)`).
|
|
272
|
-
|
|
273
|
-
```typescript
|
|
274
|
-
await window.sumor.refreshConfig()
|
|
275
|
-
```
|
|
276
|
-
|
|
277
269
|
#### login()
|
|
278
270
|
|
|
279
271
|
Redirect to OAuth authorization page.
|
package/dist/web/OAuthStore.d.ts
CHANGED
|
@@ -17,6 +17,9 @@ export type UserChangeCallback = (user: UserInfo | null) => void;
|
|
|
17
17
|
declare class OAuthStore {
|
|
18
18
|
private userChangeSubscribers;
|
|
19
19
|
private refreshSubscribers;
|
|
20
|
+
private loaded;
|
|
21
|
+
private loadTime;
|
|
22
|
+
private isRefreshing;
|
|
20
23
|
constructor();
|
|
21
24
|
/**
|
|
22
25
|
* 初始化 window.OAuthToken 存储
|
|
@@ -82,6 +85,22 @@ declare class OAuthStore {
|
|
|
82
85
|
* 清空令牌刷新订阅
|
|
83
86
|
*/
|
|
84
87
|
clearRefreshSubscribers(): void;
|
|
88
|
+
/**
|
|
89
|
+
* 检查缓存是否有效
|
|
90
|
+
*/
|
|
91
|
+
isCacheValid(cacheTTL: number): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 标记为已加载并更新加载时间
|
|
94
|
+
*/
|
|
95
|
+
markAsLoaded(): void;
|
|
96
|
+
/**
|
|
97
|
+
* 获取是否正在刷新状态
|
|
98
|
+
*/
|
|
99
|
+
getIsRefreshing(): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* 设置刷新状态
|
|
102
|
+
*/
|
|
103
|
+
setIsRefreshing(isRefreshing: boolean): void;
|
|
85
104
|
}
|
|
86
105
|
export declare const oauthStore: OAuthStore;
|
|
87
106
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthStore.d.ts","sourceRoot":"","sources":["../../web/OAuthStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;AAEhE,cAAM,UAAU;IACd,OAAO,CAAC,qBAAqB,CAAgC;IAC7D,OAAO,CAAC,kBAAkB,CAAwB;;
|
|
1
|
+
{"version":3,"file":"OAuthStore.d.ts","sourceRoot":"","sources":["../../web/OAuthStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;AAEhE,cAAM,UAAU;IACd,OAAO,CAAC,qBAAqB,CAAgC;IAC7D,OAAO,CAAC,kBAAkB,CAAwB;IAClD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAiB;;IASrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,WAAW,IAAI,MAAM;IAMrB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,eAAe,IAAI,MAAM;IAKzB;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAO3C;;OAEG;IACH,OAAO,IAAI,QAAQ,GAAG,IAAI;IAK1B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI;IAYpC;;OAEG;IACH,OAAO,IAAI,kBAAkB;IAS7B;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,kBAAkB,GAAG,IAAI;IAchD;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAIhD;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjD;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,uBAAuB,IAAI,IAAI;IAI/B;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;CAG7C;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAA"}
|
package/dist/web/OAuthStore.js
CHANGED
|
@@ -6,6 +6,9 @@ class OAuthStore {
|
|
|
6
6
|
constructor() {
|
|
7
7
|
this.userChangeSubscribers = [];
|
|
8
8
|
this.refreshSubscribers = [];
|
|
9
|
+
this.loaded = false;
|
|
10
|
+
this.loadTime = 0;
|
|
11
|
+
this.isRefreshing = false;
|
|
9
12
|
// 从 window.OAuthToken 中初始化
|
|
10
13
|
if (!this.getStoredData()) {
|
|
11
14
|
this.initializeStorage();
|
|
@@ -159,6 +162,35 @@ class OAuthStore {
|
|
|
159
162
|
clearRefreshSubscribers() {
|
|
160
163
|
this.refreshSubscribers = [];
|
|
161
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* 检查缓存是否有效
|
|
167
|
+
*/
|
|
168
|
+
isCacheValid(cacheTTL) {
|
|
169
|
+
if (!this.loaded) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const now = Date.now();
|
|
173
|
+
return now - this.loadTime < cacheTTL;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 标记为已加载并更新加载时间
|
|
177
|
+
*/
|
|
178
|
+
markAsLoaded() {
|
|
179
|
+
this.loaded = true;
|
|
180
|
+
this.loadTime = Date.now();
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 获取是否正在刷新状态
|
|
184
|
+
*/
|
|
185
|
+
getIsRefreshing() {
|
|
186
|
+
return this.isRefreshing;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 设置刷新状态
|
|
190
|
+
*/
|
|
191
|
+
setIsRefreshing(isRefreshing) {
|
|
192
|
+
this.isRefreshing = isRefreshing;
|
|
193
|
+
}
|
|
162
194
|
}
|
|
163
195
|
// 导出单例
|
|
164
196
|
export const oauthStore = new OAuthStore();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthStore.js","sourceRoot":"","sources":["../../web/OAuthStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,UAAU;
|
|
1
|
+
{"version":3,"file":"OAuthStore.js","sourceRoot":"","sources":["../../web/OAuthStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 检查用户是否有特定权限
|
|
3
|
+
* @param module 模块名称(如:posts、comments)
|
|
4
|
+
* @param operation 操作名称(如:view、edit、delete),为 * 或不传时表示检查模块的任何权限
|
|
5
|
+
* @returns 是否拥有权限
|
|
6
|
+
*
|
|
7
|
+
* 例如:
|
|
8
|
+
* - hasPermission('posts', 'edit') 检查是否有 'posts:edit' 权限
|
|
9
|
+
* - hasPermission('posts', '*') 或 hasPermission('posts') 检查是否有任何 posts 权限
|
|
10
|
+
*/
|
|
11
|
+
export default function hasPermission(module: string, operation?: string): boolean;
|
|
12
|
+
//# sourceMappingURL=hasPermission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasPermission.d.ts","sourceRoot":"","sources":["../../../web/api/hasPermission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAgBtF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 检查用户是否有特定权限
|
|
3
|
+
* @param module 模块名称(如:posts、comments)
|
|
4
|
+
* @param operation 操作名称(如:view、edit、delete),为 * 或不传时表示检查模块的任何权限
|
|
5
|
+
* @returns 是否拥有权限
|
|
6
|
+
*
|
|
7
|
+
* 例如:
|
|
8
|
+
* - hasPermission('posts', 'edit') 检查是否有 'posts:edit' 权限
|
|
9
|
+
* - hasPermission('posts', '*') 或 hasPermission('posts') 检查是否有任何 posts 权限
|
|
10
|
+
*/
|
|
11
|
+
import { oauthStore } from '../OAuthStore';
|
|
12
|
+
export default function hasPermission(module, operation = '*') {
|
|
13
|
+
const user = oauthStore.getUser();
|
|
14
|
+
if (!user || !user.permissions) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const userPermissions = user.permissions.split(',').map(p => p.trim());
|
|
18
|
+
// 如果 operation 为 *,检查是否有该模块的任何权限
|
|
19
|
+
if (operation === '*') {
|
|
20
|
+
return userPermissions.some(permission => permission.startsWith(`${module}:`));
|
|
21
|
+
}
|
|
22
|
+
// 否则检查特定的 module:operation 权限
|
|
23
|
+
const requiredPermission = `${module}:${operation}`;
|
|
24
|
+
return userPermissions.includes(requiredPermission);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=hasPermission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasPermission.js","sourceRoot":"","sources":["../../../web/api/hasPermission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAc,EAAE,YAAoB,GAAG;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;IACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAEtE,iCAAiC;IACjC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;IAChF,CAAC;IAED,8BAA8B;IAC9B,MAAM,kBAAkB,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,CAAA;IACnD,OAAO,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasRole.d.ts","sourceRoot":"","sources":["../../../web/api/hasRole.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQrD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 检查用户是否拥有指定角色
|
|
3
|
+
* @param role 角色名称
|
|
4
|
+
* @returns 是否拥有该角色
|
|
5
|
+
*/
|
|
6
|
+
import { oauthStore } from '../OAuthStore';
|
|
7
|
+
export default function hasRole(role) {
|
|
8
|
+
const user = oauthStore.getUser();
|
|
9
|
+
if (!user || !user.roles) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const userRoles = user.roles.split(',');
|
|
13
|
+
return userRoles.some(r => r.trim() === role);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=hasRole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasRole.js","sourceRoot":"","sources":["../../../web/api/hasRole.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAY;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;IACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../web/api/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,OAAO,UAAU,KAAK,SAO5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 登录:跳转到授权页面
|
|
3
|
+
*/
|
|
4
|
+
import { oauthStore } from '../OAuthStore';
|
|
5
|
+
export default function login() {
|
|
6
|
+
const authorizeUrl = oauthStore.getAuthorizeUrl();
|
|
7
|
+
if (authorizeUrl) {
|
|
8
|
+
window.location.href = authorizeUrl;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
throw new Error('无法获取授权 URL');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../web/api/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,CAAC,OAAO,UAAU,KAAK;IAC3B,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,EAAE,CAAA;IACjD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../web/api/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAA8B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 登出:调用后端登出接口,撤销会话
|
|
3
|
+
*/
|
|
4
|
+
import { oauthStore } from '../OAuthStore';
|
|
5
|
+
import { axiosInstance } from '../axiosInstance';
|
|
6
|
+
export default async function logout() {
|
|
7
|
+
try {
|
|
8
|
+
await axiosInstance.post('/api/oauth/logout', {}, { withCredentials: true });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.error('Logout error:', error);
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
// 清空本地用户信息
|
|
16
|
+
oauthStore.clear();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../web/api/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;QACrC,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,WAAW;QACX,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshToken.d.ts","sourceRoot":"","sources":["../../../web/api/refreshToken.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAA8B,YAAY,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 刷新 OAuth 信息和用户状态
|
|
3
|
+
* 通过刷新 access token 接口获取 endpoint、authorizeUrl 和用户信息
|
|
4
|
+
* @param force 是否强制刷新,忽略缓存
|
|
5
|
+
*/
|
|
6
|
+
import { oauthStore } from '../OAuthStore';
|
|
7
|
+
import { axiosInstance } from '../axiosInstance';
|
|
8
|
+
const CACHE_TTL = 3600000; // 1小时,单位毫秒
|
|
9
|
+
export default async function refreshToken(force = false) {
|
|
10
|
+
// 如果缓存仍然有效且不是强制刷新,直接返回
|
|
11
|
+
if (!force && oauthStore.isCacheValid(CACHE_TTL)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// 直接调用 PUT /api/oauth/token 刷新接口
|
|
16
|
+
// 浏览器会自动在请求中包含 HttpOnly Cookie 中的 refresh_token
|
|
17
|
+
console.log('[Sumor] Calling PUT /api/oauth/token...');
|
|
18
|
+
const response = await axiosInstance.put('/api/oauth/token', {});
|
|
19
|
+
console.log('[Sumor] Response received:', response);
|
|
20
|
+
// 响应已被拦截器处理,返回的是 { endpoint, authorizeUrl, user }
|
|
21
|
+
if (response) {
|
|
22
|
+
const data = response;
|
|
23
|
+
oauthStore.setData(data);
|
|
24
|
+
console.log('[Sumor] User info updated:', oauthStore.getUser());
|
|
25
|
+
}
|
|
26
|
+
oauthStore.markAsLoaded();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error('[Sumor] Failed to refresh OAuth info:', error);
|
|
30
|
+
// 刷新失败时,清除用户信息(401 表示未认证)
|
|
31
|
+
if (error.response?.status === 401 || error.code === 'TOKEN_REFRESH_FAILED') {
|
|
32
|
+
console.log('[Sumor] Token refresh failed or unauthorized, clearing user');
|
|
33
|
+
oauthStore.clear();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=refreshToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshToken.js","sourceRoot":"","sources":["../../../web/api/refreshToken.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAA,CAAC,WAAW;AAErC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,YAAY,CAAC,QAAiB,KAAK;IAC/D,uBAAuB;IACvB,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,iCAAiC;QACjC,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAqB,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACpF,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;QAEnD,kDAAkD;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,QAAyC,CAAA;YACtD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QACjE,CAAC;QAED,UAAU,CAAC,YAAY,EAAE,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;QAE7D,0BAA0B;QAC1B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;YAC1E,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axiosInstance.d.ts","sourceRoot":"","sources":["../../web/axiosInstance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,EAAE,aAAa,EAAkC,MAAM,OAAO,CAAA;AA4H5E,eAAO,MAAM,aAAa,eAAwB,CAAA"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Axios 实例配置
|
|
3
|
+
* 统一管理 HTTP 请求的拦截器和配置
|
|
4
|
+
*/
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { oauthStore } from './OAuthStore';
|
|
7
|
+
/**
|
|
8
|
+
* 创建 Axios 实例并配置拦截器
|
|
9
|
+
*/
|
|
10
|
+
function createAxiosInstance() {
|
|
11
|
+
const instance = axios.create({
|
|
12
|
+
baseURL: '',
|
|
13
|
+
timeout: 30000,
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json;charset=utf-8'
|
|
16
|
+
},
|
|
17
|
+
withCredentials: true
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* 请求拦截器:处理 Token
|
|
21
|
+
*/
|
|
22
|
+
instance.interceptors.request.use(config => {
|
|
23
|
+
return config;
|
|
24
|
+
}, error => {
|
|
25
|
+
return Promise.reject(error);
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* 响应拦截器:统一处理响应数据和错误
|
|
29
|
+
*/
|
|
30
|
+
instance.interceptors.response.use(response => {
|
|
31
|
+
const data = response.data;
|
|
32
|
+
if (data.code !== 'OK') {
|
|
33
|
+
const error = new Error(data.message || '请求失败');
|
|
34
|
+
error.code = data.code;
|
|
35
|
+
return Promise.reject(error);
|
|
36
|
+
}
|
|
37
|
+
return data.data !== undefined ? data.data : true;
|
|
38
|
+
}, async (error) => {
|
|
39
|
+
const originalRequest = error.config;
|
|
40
|
+
if (error.response?.status === 401 && originalRequest && !originalRequest._retry) {
|
|
41
|
+
originalRequest._retry = true;
|
|
42
|
+
if (!oauthStore.getIsRefreshing()) {
|
|
43
|
+
oauthStore.setIsRefreshing(true);
|
|
44
|
+
try {
|
|
45
|
+
const refreshInstance = axios.create({
|
|
46
|
+
baseURL: '',
|
|
47
|
+
withCredentials: true
|
|
48
|
+
});
|
|
49
|
+
const response = await refreshInstance.put('/api/oauth/token', {});
|
|
50
|
+
if (response.status === 200) {
|
|
51
|
+
// 如果响应中包含新的用户信息,更新到 OAuthStore
|
|
52
|
+
if (response.data && response.data.data && response.data.data.user) {
|
|
53
|
+
oauthStore.setUser(response.data.data.user);
|
|
54
|
+
}
|
|
55
|
+
oauthStore.setIsRefreshing(false);
|
|
56
|
+
oauthStore.onTokenRefreshed();
|
|
57
|
+
return instance(originalRequest);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error('Token refresh failed: invalid response status');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (refreshError) {
|
|
64
|
+
oauthStore.setIsRefreshing(false);
|
|
65
|
+
oauthStore.clearRefreshSubscribers();
|
|
66
|
+
// 清空用户信息,表示已退出登录
|
|
67
|
+
oauthStore.setUser(null);
|
|
68
|
+
const error = new Error('令牌已过期,请重新登录');
|
|
69
|
+
error.code = 'TOKEN_REFRESH_FAILED';
|
|
70
|
+
return Promise.reject(error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
oauthStore.subscribeTokenRefresh(() => {
|
|
76
|
+
resolve(instance(originalRequest));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (error.response?.data) {
|
|
82
|
+
const data = error.response.data;
|
|
83
|
+
const err = new Error(data.message || error.message || '请求失败');
|
|
84
|
+
err.code = data.code || 'REQUEST_FAILED';
|
|
85
|
+
return Promise.reject(err);
|
|
86
|
+
}
|
|
87
|
+
const err = new Error(error.message || '网络错误');
|
|
88
|
+
err.code = 'NETWORK_ERROR';
|
|
89
|
+
return Promise.reject(err);
|
|
90
|
+
});
|
|
91
|
+
return instance;
|
|
92
|
+
}
|
|
93
|
+
export const axiosInstance = createAxiosInstance();
|
|
94
|
+
//# sourceMappingURL=axiosInstance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axiosInstance.js","sourceRoot":"","sources":["../../web/axiosInstance.ts"],"names":[],"mappings":"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"}
|
package/dist/web/index.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sumor Framework -
|
|
2
|
+
* Sumor Framework - 轻呈云客户端 API
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
5
|
-
export {
|
|
4
|
+
export { default as refreshToken } from './api/refreshToken';
|
|
5
|
+
export { default as login } from './api/login';
|
|
6
|
+
export { default as logout } from './api/logout';
|
|
7
|
+
export { default as hasPermission } from './api/hasPermission';
|
|
8
|
+
export { default as hasRole } from './api/hasRole';
|
|
6
9
|
export { oauthUrl } from './UrlHelper';
|
|
7
10
|
export { oauthStore } from './OAuthStore';
|
|
11
|
+
export { axiosInstance as axios } from './axiosInstance';
|
|
8
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/web/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/web/index.js
CHANGED
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sumor Framework -
|
|
2
|
+
* Sumor Framework - 轻呈云客户端 API
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
// 挂载到全局 window 对象
|
|
12
|
-
window.sumor = sumor;
|
|
13
|
-
console.log('[setupSumor] Sumor initialized');
|
|
14
|
-
console.log('✓ 完成轻呈云客户端初始化');
|
|
15
|
-
}
|
|
16
|
-
export { Sumor } from './Sumor';
|
|
4
|
+
// 导出所有 API 函数
|
|
5
|
+
export { default as refreshToken } from './api/refreshToken';
|
|
6
|
+
export { default as login } from './api/login';
|
|
7
|
+
export { default as logout } from './api/logout';
|
|
8
|
+
export { default as hasPermission } from './api/hasPermission';
|
|
9
|
+
export { default as hasRole } from './api/hasRole';
|
|
10
|
+
// 导出其他工具
|
|
17
11
|
export { oauthUrl } from './UrlHelper';
|
|
18
12
|
export { oauthStore } from './OAuthStore';
|
|
13
|
+
export { axiosInstance as axios } from './axiosInstance';
|
|
19
14
|
//# sourceMappingURL=index.js.map
|
package/dist/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAElD,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,iBAAiB,CAAA"}
|
package/package.json
CHANGED
package/dist/web/Sumor.d.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sumor Class - 轻呈云客户端主类
|
|
3
|
-
*/
|
|
4
|
-
import { AxiosInstance, AxiosRequestConfig } from 'axios';
|
|
5
|
-
import { UserInfo } from './OAuthStore';
|
|
6
|
-
export declare class Sumor {
|
|
7
|
-
axios: AxiosInstance;
|
|
8
|
-
private loaded;
|
|
9
|
-
private loadTime;
|
|
10
|
-
private readonly CACHE_TTL;
|
|
11
|
-
private isRefreshing;
|
|
12
|
-
constructor();
|
|
13
|
-
/**
|
|
14
|
-
* 订阅用户变化事件
|
|
15
|
-
* @param callback 用户变化时的回调函数
|
|
16
|
-
*/
|
|
17
|
-
onUserChange(callback: (user: UserInfo | null) => void): void;
|
|
18
|
-
/**
|
|
19
|
-
* 创建 Axios 实例并配置拦截器
|
|
20
|
-
*/
|
|
21
|
-
private createAxiosInstance;
|
|
22
|
-
/**
|
|
23
|
-
* 通用 API 请求方法
|
|
24
|
-
*/
|
|
25
|
-
request<T = any>(url: string, params?: Record<string, any>, config?: AxiosRequestConfig): Promise<T>;
|
|
26
|
-
/**
|
|
27
|
-
* GET 请求
|
|
28
|
-
*/
|
|
29
|
-
get<T = any>(url: string, params?: Record<string, any>, config?: AxiosRequestConfig): Promise<T>;
|
|
30
|
-
/**
|
|
31
|
-
* POST 请求
|
|
32
|
-
*/
|
|
33
|
-
post<T = any>(url: string, data: Record<string, any>, config?: AxiosRequestConfig): Promise<T>;
|
|
34
|
-
private isCacheValid;
|
|
35
|
-
/**
|
|
36
|
-
* 刷新 OAuth 信息和用户状态
|
|
37
|
-
* 通过刷新 access token 接口获取 endpoint、authorizeUrl 和用户信息
|
|
38
|
-
* @param force 是否强制刷新,忽略缓存
|
|
39
|
-
*/
|
|
40
|
-
refreshToken(force?: boolean): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* 登录:跳转到授权页面
|
|
43
|
-
*/
|
|
44
|
-
login(): void;
|
|
45
|
-
/**
|
|
46
|
-
* 登出:调用后端登出接口,撤销会话
|
|
47
|
-
*/
|
|
48
|
-
logout(): Promise<void>;
|
|
49
|
-
/**
|
|
50
|
-
* 手动刷新配置(用于处理长期运行的应用需要更新配置的情况)
|
|
51
|
-
*/
|
|
52
|
-
refreshConfig(): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* 检查用户是否有特定权限
|
|
55
|
-
* @param module 模块名称(如:posts、comments)
|
|
56
|
-
* @param operation 操作名称(如:view、edit、delete),为 * 或不传时表示检查模块的任何权限
|
|
57
|
-
* @returns 是否拥有权限
|
|
58
|
-
*
|
|
59
|
-
* 例如:
|
|
60
|
-
* - hasPermission('posts', 'edit') 检查是否有 'posts:edit' 权限
|
|
61
|
-
* - hasPermission('posts', '*') 或 hasPermission('posts') 检查是否有任何 posts 权限
|
|
62
|
-
*/
|
|
63
|
-
hasPermission(module: string, operation?: string): boolean;
|
|
64
|
-
/**
|
|
65
|
-
* 检查用户是否拥有指定角色
|
|
66
|
-
* @param role 角色名称
|
|
67
|
-
* @returns 是否拥有该角色
|
|
68
|
-
*/
|
|
69
|
-
hasRole(role: string): boolean;
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=Sumor.d.ts.map
|
package/dist/web/Sumor.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Sumor.d.ts","sourceRoot":"","sources":["../../web/Sumor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAAc,MAAM,OAAO,CAAA;AAC5E,OAAO,EAAc,QAAQ,EAAsB,MAAM,cAAc,CAAA;AAkBvE,qBAAa,KAAK;IACT,KAAK,EAAE,aAAa,CAAA;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,YAAY,CAAiB;;IAOrC;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAI7D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsG3B;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,GAAG,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAQb;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAIb;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAIb,OAAO,CAAC,YAAY;IAQpB;;;;OAIG;IACG,YAAY,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzD;;OAEG;IACH,KAAK;IASL;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;;;;;;;;OASG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO;IAkB/D;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAS/B"}
|
package/dist/web/Sumor.js
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sumor Class - 轻呈云客户端主类
|
|
3
|
-
*/
|
|
4
|
-
import axios from 'axios';
|
|
5
|
-
import { oauthStore } from './OAuthStore';
|
|
6
|
-
export class Sumor {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.loaded = false;
|
|
9
|
-
this.loadTime = 0;
|
|
10
|
-
this.CACHE_TTL = 3600000; // 1小时,单位毫秒
|
|
11
|
-
this.isRefreshing = false;
|
|
12
|
-
console.log('初始化轻呈云客户端...');
|
|
13
|
-
this.axios = this.createAxiosInstance();
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 订阅用户变化事件
|
|
17
|
-
* @param callback 用户变化时的回调函数
|
|
18
|
-
*/
|
|
19
|
-
onUserChange(callback) {
|
|
20
|
-
oauthStore.onUserChange(callback);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* 创建 Axios 实例并配置拦截器
|
|
24
|
-
*/
|
|
25
|
-
createAxiosInstance() {
|
|
26
|
-
const instance = axios.create({
|
|
27
|
-
baseURL: '',
|
|
28
|
-
timeout: 30000,
|
|
29
|
-
headers: {
|
|
30
|
-
'Content-Type': 'application/json;charset=utf-8'
|
|
31
|
-
},
|
|
32
|
-
withCredentials: true
|
|
33
|
-
});
|
|
34
|
-
/**
|
|
35
|
-
* 请求拦截器:处理 Token
|
|
36
|
-
*/
|
|
37
|
-
instance.interceptors.request.use(config => {
|
|
38
|
-
return config;
|
|
39
|
-
}, error => {
|
|
40
|
-
return Promise.reject(error);
|
|
41
|
-
});
|
|
42
|
-
/**
|
|
43
|
-
* 响应拦截器:统一处理响应数据和错误
|
|
44
|
-
*/
|
|
45
|
-
instance.interceptors.response.use(response => {
|
|
46
|
-
const data = response.data;
|
|
47
|
-
if (data.code !== 'OK') {
|
|
48
|
-
const error = new Error(data.message || '请求失败');
|
|
49
|
-
error.code = data.code;
|
|
50
|
-
return Promise.reject(error);
|
|
51
|
-
}
|
|
52
|
-
return data.data !== undefined ? data.data : true;
|
|
53
|
-
}, async (error) => {
|
|
54
|
-
const originalRequest = error.config;
|
|
55
|
-
if (error.response?.status === 401 && originalRequest && !originalRequest._retry) {
|
|
56
|
-
originalRequest._retry = true;
|
|
57
|
-
if (!this.isRefreshing) {
|
|
58
|
-
this.isRefreshing = true;
|
|
59
|
-
try {
|
|
60
|
-
const refreshInstance = axios.create({
|
|
61
|
-
baseURL: '',
|
|
62
|
-
withCredentials: true
|
|
63
|
-
});
|
|
64
|
-
const response = await refreshInstance.put('/api/oauth/token', {});
|
|
65
|
-
if (response.status === 200) {
|
|
66
|
-
// 如果响应中包含新的用户信息,更新到 OAuthStore
|
|
67
|
-
if (response.data && response.data.data && response.data.data.user) {
|
|
68
|
-
oauthStore.setUser(response.data.data.user);
|
|
69
|
-
}
|
|
70
|
-
this.isRefreshing = false;
|
|
71
|
-
oauthStore.onTokenRefreshed();
|
|
72
|
-
return instance(originalRequest);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
throw new Error('Token refresh failed: invalid response status');
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch (refreshError) {
|
|
79
|
-
this.isRefreshing = false;
|
|
80
|
-
oauthStore.clearRefreshSubscribers();
|
|
81
|
-
// 清空用户信息,表示已退出登录
|
|
82
|
-
oauthStore.setUser(null);
|
|
83
|
-
const error = new Error('令牌已过期,请重新登录');
|
|
84
|
-
error.code = 'TOKEN_REFRESH_FAILED';
|
|
85
|
-
return Promise.reject(error);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
return new Promise((resolve, reject) => {
|
|
90
|
-
oauthStore.subscribeTokenRefresh(() => {
|
|
91
|
-
resolve(instance(originalRequest));
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (error.response?.data) {
|
|
97
|
-
const data = error.response.data;
|
|
98
|
-
const err = new Error(data.message || error.message || '请求失败');
|
|
99
|
-
err.code = data.code || 'REQUEST_FAILED';
|
|
100
|
-
return Promise.reject(err);
|
|
101
|
-
}
|
|
102
|
-
const err = new Error(error.message || '网络错误');
|
|
103
|
-
err.code = 'NETWORK_ERROR';
|
|
104
|
-
return Promise.reject(err);
|
|
105
|
-
});
|
|
106
|
-
return instance;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 通用 API 请求方法
|
|
110
|
-
*/
|
|
111
|
-
async request(url, params = {}, config) {
|
|
112
|
-
try {
|
|
113
|
-
return (await this.axios.post(url, params, config));
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
throw error;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* GET 请求
|
|
121
|
-
*/
|
|
122
|
-
async get(url, params, config) {
|
|
123
|
-
return this.axios.get(url, { params, ...config });
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* POST 请求
|
|
127
|
-
*/
|
|
128
|
-
async post(url, data, config) {
|
|
129
|
-
return this.axios.post(url, data, config);
|
|
130
|
-
}
|
|
131
|
-
isCacheValid() {
|
|
132
|
-
if (!this.loaded) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
const now = Date.now();
|
|
136
|
-
return now - this.loadTime < this.CACHE_TTL;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* 刷新 OAuth 信息和用户状态
|
|
140
|
-
* 通过刷新 access token 接口获取 endpoint、authorizeUrl 和用户信息
|
|
141
|
-
* @param force 是否强制刷新,忽略缓存
|
|
142
|
-
*/
|
|
143
|
-
async refreshToken(force = false) {
|
|
144
|
-
// 如果缓存仍然有效且不是强制刷新,直接返回
|
|
145
|
-
if (!force && this.isCacheValid()) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
// 直接调用 PUT /api/oauth/token 刷新接口
|
|
150
|
-
// 浏览器会自动在请求中包含 HttpOnly Cookie 中的 refresh_token
|
|
151
|
-
console.log('[Sumor] Calling PUT /api/oauth/token...');
|
|
152
|
-
const response = await this.axios.put('/api/oauth/token', {});
|
|
153
|
-
console.log('[Sumor] Response received:', response);
|
|
154
|
-
// 响应已被拦截器处理,返回的是 { endpoint, authorizeUrl, user }
|
|
155
|
-
if (response) {
|
|
156
|
-
const data = response;
|
|
157
|
-
oauthStore.setData(data);
|
|
158
|
-
console.log('[Sumor] User info updated:', oauthStore.getUser());
|
|
159
|
-
}
|
|
160
|
-
this.loaded = true;
|
|
161
|
-
this.loadTime = Date.now();
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
console.error('[Sumor] Failed to refresh OAuth info:', error);
|
|
165
|
-
// 刷新失败时,清除用户信息(401 表示未认证)
|
|
166
|
-
if (error.response?.status === 401 || error.code === 'TOKEN_REFRESH_FAILED') {
|
|
167
|
-
console.log('[Sumor] Token refresh failed or unauthorized, clearing user');
|
|
168
|
-
oauthStore.clear();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* 登录:跳转到授权页面
|
|
174
|
-
*/
|
|
175
|
-
login() {
|
|
176
|
-
const authorizeUrl = oauthStore.getAuthorizeUrl();
|
|
177
|
-
if (authorizeUrl) {
|
|
178
|
-
window.location.href = authorizeUrl;
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
throw new Error('无法获取授权 URL');
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 登出:调用后端登出接口,撤销会话
|
|
186
|
-
*/
|
|
187
|
-
async logout() {
|
|
188
|
-
try {
|
|
189
|
-
await axios.post('/api/oauth/logout', {}, { withCredentials: true });
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
console.error('Logout error:', error);
|
|
193
|
-
throw error;
|
|
194
|
-
}
|
|
195
|
-
finally {
|
|
196
|
-
// 清空本地用户信息
|
|
197
|
-
oauthStore.clear();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* 手动刷新配置(用于处理长期运行的应用需要更新配置的情况)
|
|
202
|
-
*/
|
|
203
|
-
async refreshConfig() {
|
|
204
|
-
await this.refreshToken(true);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* 检查用户是否有特定权限
|
|
208
|
-
* @param module 模块名称(如:posts、comments)
|
|
209
|
-
* @param operation 操作名称(如:view、edit、delete),为 * 或不传时表示检查模块的任何权限
|
|
210
|
-
* @returns 是否拥有权限
|
|
211
|
-
*
|
|
212
|
-
* 例如:
|
|
213
|
-
* - hasPermission('posts', 'edit') 检查是否有 'posts:edit' 权限
|
|
214
|
-
* - hasPermission('posts', '*') 或 hasPermission('posts') 检查是否有任何 posts 权限
|
|
215
|
-
*/
|
|
216
|
-
hasPermission(module, operation = '*') {
|
|
217
|
-
const user = oauthStore.getUser();
|
|
218
|
-
if (!user || !user.permissions) {
|
|
219
|
-
return false;
|
|
220
|
-
}
|
|
221
|
-
const userPermissions = user.permissions.split(',').map(p => p.trim());
|
|
222
|
-
// 如果 operation 为 *,检查是否有该模块的任何权限
|
|
223
|
-
if (operation === '*') {
|
|
224
|
-
return userPermissions.some(permission => permission.startsWith(`${module}:`));
|
|
225
|
-
}
|
|
226
|
-
// 否则检查特定的 module:operation 权限
|
|
227
|
-
const requiredPermission = `${module}:${operation}`;
|
|
228
|
-
return userPermissions.includes(requiredPermission);
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* 检查用户是否拥有指定角色
|
|
232
|
-
* @param role 角色名称
|
|
233
|
-
* @returns 是否拥有该角色
|
|
234
|
-
*/
|
|
235
|
-
hasRole(role) {
|
|
236
|
-
const user = oauthStore.getUser();
|
|
237
|
-
if (!user || !user.roles) {
|
|
238
|
-
return false;
|
|
239
|
-
}
|
|
240
|
-
const userRoles = user.roles.split(',');
|
|
241
|
-
return userRoles.some(r => r.trim() === role);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
//# sourceMappingURL=Sumor.js.map
|
package/dist/web/Sumor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Sumor.js","sourceRoot":"","sources":["../../web/Sumor.ts"],"names":[],"mappings":"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"}
|