@choiceform/shared-auth 0.1.13 → 0.1.15
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 +106 -450
- package/dist/api/auth-api.d.ts +28 -0
- package/dist/api/auth-api.d.ts.map +1 -0
- package/dist/api/auth-api.js +133 -0
- package/dist/api/client.d.ts +34 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +104 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/organization-api.d.ts +96 -0
- package/dist/api/organization-api.d.ts.map +1 -0
- package/dist/api/organization-api.js +228 -0
- package/dist/api/team-api.d.ts +57 -0
- package/dist/api/team-api.d.ts.map +1 -0
- package/dist/api/team-api.js +118 -0
- package/dist/config.d.ts +4 -50
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -6
- package/dist/core.d.ts +307 -1717
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +35 -17
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -12
- package/dist/init.d.ts +326 -1732
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +13 -14
- package/dist/lib/auth-client.d.ts +232 -1689
- package/dist/lib/auth-client.d.ts.map +1 -1
- package/dist/lib/auth-client.js +10 -16
- package/dist/services/companion-team.d.ts +16 -0
- package/dist/services/companion-team.d.ts.map +1 -0
- package/dist/services/companion-team.js +73 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/store/actions.d.ts +45 -30
- package/dist/store/actions.d.ts.map +1 -1
- package/dist/store/actions.js +139 -103
- package/dist/store/index.d.ts +8 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +7 -0
- package/dist/store/state.d.ts +10 -7
- package/dist/store/state.d.ts.map +1 -1
- package/dist/store/state.js +31 -23
- package/dist/store/utils.d.ts +22 -71
- package/dist/store/utils.d.ts.map +1 -1
- package/dist/store/utils.js +28 -146
- package/dist/types/auth.d.ts +107 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +4 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/organization.d.ts +111 -0
- package/dist/types/organization.d.ts.map +1 -0
- package/dist/types/organization.js +4 -0
- package/dist/types/team.d.ts +52 -0
- package/dist/types/team.d.ts.map +1 -0
- package/dist/types/team.js +4 -0
- package/dist/types/user.d.ts +44 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +4 -0
- package/dist/utils/date.d.ts +10 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +13 -0
- package/dist/utils/env.d.ts +20 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +23 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/user-mapper.d.ts +21 -0
- package/dist/utils/user-mapper.d.ts.map +1 -0
- package/dist/utils/user-mapper.js +55 -0
- package/package.json +3 -4
- package/dist/components/auth-sync.d.ts +0 -25
- package/dist/components/auth-sync.d.ts.map +0 -1
- package/dist/components/auth-sync.js +0 -346
- package/dist/components/protected-route.d.ts +0 -18
- package/dist/components/protected-route.d.ts.map +0 -1
- package/dist/components/protected-route.js +0 -34
- package/dist/components/sign-in-page.d.ts +0 -21
- package/dist/components/sign-in-page.d.ts.map +0 -1
- package/dist/components/sign-in-page.js +0 -31
- package/dist/core/init-auth-sync.d.ts +0 -7
- package/dist/core/init-auth-sync.d.ts.map +0 -1
- package/dist/core/init-auth-sync.js +0 -34
- package/dist/types.d.ts +0 -87
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -4
package/dist/store/state.d.ts
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 认证状态 Store
|
|
3
|
+
*/
|
|
1
4
|
import type { AuthState } from "../types";
|
|
5
|
+
import type { TokenStorage } from "../api";
|
|
6
|
+
/**
|
|
7
|
+
* 创建 Token 存储工具
|
|
8
|
+
*/
|
|
9
|
+
export declare function createTokenStorage(tokenStorageKey: string): TokenStorage;
|
|
2
10
|
/**
|
|
3
|
-
* 创建认证状态
|
|
11
|
+
* 创建认证状态 Store
|
|
4
12
|
*/
|
|
5
13
|
export declare function createAuthStore(config: {
|
|
6
14
|
tokenStorageKey: string;
|
|
7
15
|
}): {
|
|
8
16
|
authStore: import("@legendapp/state").Observable<AuthState>;
|
|
9
|
-
tokenStorage:
|
|
10
|
-
save(token: string | null): void;
|
|
11
|
-
get(): string | null;
|
|
12
|
-
clear(): void;
|
|
13
|
-
};
|
|
17
|
+
tokenStorage: TokenStorage;
|
|
14
18
|
};
|
|
15
|
-
export type TokenStorage = ReturnType<typeof createAuthStore>["tokenStorage"];
|
|
16
19
|
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/store/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/store/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAE1C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,CA4BxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE;;;EA2BlE"}
|
package/dist/store/state.js
CHANGED
|
@@ -1,53 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 认证状态 Store
|
|
3
|
+
*/
|
|
1
4
|
import { observable } from "@legendapp/state";
|
|
2
5
|
/**
|
|
3
|
-
*
|
|
6
|
+
* 创建 Token 存储工具
|
|
4
7
|
*/
|
|
5
|
-
export function
|
|
6
|
-
const { tokenStorageKey } = config;
|
|
7
|
-
// 从 localStorage 读取初始 token
|
|
8
|
+
export function createTokenStorage(tokenStorageKey) {
|
|
8
9
|
const getStoredToken = () => {
|
|
9
10
|
try {
|
|
10
|
-
|
|
11
|
-
if (!stored)
|
|
12
|
-
return null;
|
|
13
|
-
return stored;
|
|
11
|
+
return localStorage.getItem(tokenStorageKey);
|
|
14
12
|
}
|
|
15
13
|
catch {
|
|
16
14
|
return null;
|
|
17
15
|
}
|
|
18
16
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
isAuthenticated: false,
|
|
22
|
-
isLoaded: false,
|
|
23
|
-
loading: true,
|
|
24
|
-
error: null,
|
|
25
|
-
token: getStoredToken(),
|
|
26
|
-
});
|
|
27
|
-
// 手动管理 token 的 localStorage 存储
|
|
28
|
-
const tokenStorage = {
|
|
17
|
+
return {
|
|
18
|
+
get: getStoredToken,
|
|
29
19
|
save(token) {
|
|
30
20
|
try {
|
|
31
21
|
if (token) {
|
|
32
22
|
localStorage.setItem(tokenStorageKey, token);
|
|
33
|
-
authStore.token.set(token);
|
|
34
23
|
}
|
|
35
24
|
else {
|
|
36
25
|
localStorage.removeItem(tokenStorageKey);
|
|
37
|
-
authStore.token.set(null);
|
|
38
26
|
}
|
|
39
27
|
}
|
|
40
28
|
catch (error) {
|
|
41
29
|
console.error("Failed to save token to localStorage:", error);
|
|
42
30
|
}
|
|
43
31
|
},
|
|
44
|
-
get() {
|
|
45
|
-
return getStoredToken();
|
|
46
|
-
},
|
|
47
32
|
clear() {
|
|
48
33
|
this.save(null);
|
|
49
34
|
},
|
|
50
35
|
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 创建认证状态 Store
|
|
39
|
+
*/
|
|
40
|
+
export function createAuthStore(config) {
|
|
41
|
+
const { tokenStorageKey } = config;
|
|
42
|
+
// 创建 token 存储工具
|
|
43
|
+
const tokenStorage = createTokenStorage(tokenStorageKey);
|
|
44
|
+
// 创建 observable store
|
|
45
|
+
const authStore = observable({
|
|
46
|
+
user: null,
|
|
47
|
+
isAuthenticated: false,
|
|
48
|
+
isLoaded: false,
|
|
49
|
+
loading: true,
|
|
50
|
+
error: null,
|
|
51
|
+
token: tokenStorage.get(),
|
|
52
|
+
});
|
|
53
|
+
// 同步 token 到 store
|
|
54
|
+
const originalSave = tokenStorage.save.bind(tokenStorage);
|
|
55
|
+
tokenStorage.save = (token) => {
|
|
56
|
+
originalSave(token);
|
|
57
|
+
authStore.token.set(token);
|
|
58
|
+
};
|
|
51
59
|
return {
|
|
52
60
|
authStore,
|
|
53
61
|
tokenStorage,
|
package/dist/store/utils.d.ts
CHANGED
|
@@ -1,103 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store 工具函数
|
|
3
|
+
*/
|
|
1
4
|
import type { Observable } from "@legendapp/state";
|
|
2
5
|
import type { AuthState, SessionUser } from "../types";
|
|
3
|
-
import type { TokenStorage } from "
|
|
6
|
+
import type { ApiClient, TokenStorage } from "../api";
|
|
4
7
|
import type { AuthActions } from "./actions";
|
|
5
|
-
/**
|
|
6
|
-
* 获取当前用户
|
|
7
|
-
*/
|
|
8
8
|
export declare function getCurrentUser(authStore: Observable<AuthState>): SessionUser | null;
|
|
9
|
-
/**
|
|
10
|
-
* 获取当前用户ID
|
|
11
|
-
*/
|
|
12
9
|
export declare function getCurrentUserId(authStore: Observable<AuthState>): string | null;
|
|
13
|
-
/**
|
|
14
|
-
* 安全获取当前用户ID
|
|
15
|
-
*/
|
|
16
|
-
export declare function getCurrentUserIdSafe(authStore: Observable<AuthState>): string | null;
|
|
17
|
-
/**
|
|
18
|
-
* 检查是否已认证
|
|
19
|
-
*/
|
|
20
10
|
export declare function isAuthenticated(authStore: Observable<AuthState>): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* 检查是否正在加载
|
|
23
|
-
*/
|
|
24
11
|
export declare function isLoading(authStore: Observable<AuthState>): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* 检查是否已加载
|
|
27
|
-
*/
|
|
28
12
|
export declare function isLoaded(authStore: Observable<AuthState>): boolean;
|
|
29
|
-
/**
|
|
30
|
-
* 等待认证完成
|
|
31
|
-
* 使用轮询方式检查认证状态(简单但有效)
|
|
32
|
-
*
|
|
33
|
-
* 注意:如果长时间未加载,Promise 不会自动 reject
|
|
34
|
-
* 建议在外层添加超时处理
|
|
35
|
-
*/
|
|
36
13
|
export declare function waitForAuth(authStore: Observable<AuthState>): Promise<void>;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
export declare function
|
|
41
|
-
getSession: () => Promise<unknown>;
|
|
42
|
-
}): Promise<string | null>;
|
|
43
|
-
/**
|
|
44
|
-
* 获取认证头
|
|
45
|
-
*/
|
|
46
|
-
export declare function getAuthHeaders(authStore: Observable<AuthState>, tokenStorage: TokenStorage, authActions: AuthActions, authClient: {
|
|
47
|
-
getSession: () => Promise<unknown>;
|
|
48
|
-
}): Promise<Record<string, string>>;
|
|
49
|
-
/**
|
|
50
|
-
* 处理 401 响应
|
|
51
|
-
*/
|
|
14
|
+
export declare function getAuthTokenSync(tokenStorage: TokenStorage): string | null;
|
|
15
|
+
export declare function getAuthToken(tokenStorage: TokenStorage): Promise<string | null>;
|
|
16
|
+
export declare function getAuthHeadersSync(tokenStorage: TokenStorage): Record<string, string>;
|
|
17
|
+
export declare function getAuthHeaders(tokenStorage: TokenStorage): Promise<Record<string, string>>;
|
|
52
18
|
export declare function handle401Response(response: Response, authActions: AuthActions): Response;
|
|
53
|
-
/**
|
|
54
|
-
* API 客户端工具
|
|
55
|
-
*/
|
|
56
|
-
export declare function createApiClient(authStore: Observable<AuthState>, tokenStorage: TokenStorage, authActions: AuthActions, authClient: {
|
|
57
|
-
getSession: () => Promise<unknown>;
|
|
58
|
-
}): {
|
|
59
|
-
get(url: string, options?: RequestInit): Promise<Response>;
|
|
60
|
-
post(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
|
|
61
|
-
put(url: string, body?: unknown, options?: RequestInit): Promise<Response>;
|
|
62
|
-
delete(url: string, options?: RequestInit): Promise<Response>;
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* 用户管理器
|
|
66
|
-
*/
|
|
67
19
|
export declare function createUserManager(authStore: Observable<AuthState>): {
|
|
68
|
-
getUser()
|
|
69
|
-
getUserId()
|
|
20
|
+
getUser: () => SessionUser | null;
|
|
21
|
+
getUserId: () => string | null;
|
|
70
22
|
};
|
|
71
23
|
/**
|
|
72
|
-
*
|
|
73
|
-
* 这样就不需要在每个项目中重复包装工具函数
|
|
24
|
+
* 创建绑定好的工具函数集合
|
|
74
25
|
*/
|
|
75
26
|
export declare function createBoundAuthUtils(instance: {
|
|
27
|
+
apiClient: ApiClient;
|
|
28
|
+
authActions: AuthActions;
|
|
76
29
|
authStore: Observable<AuthState>;
|
|
77
30
|
tokenStorage: TokenStorage;
|
|
78
|
-
authActions: AuthActions;
|
|
79
|
-
authClient: {
|
|
80
|
-
getSession: () => Promise<unknown>;
|
|
81
|
-
};
|
|
82
31
|
}): {
|
|
83
32
|
getCurrentUser: () => SessionUser | null;
|
|
84
33
|
getCurrentUserId: () => string | null;
|
|
85
|
-
getCurrentUserIdSafe: () => string | null;
|
|
86
34
|
isAuthenticated: () => boolean;
|
|
87
35
|
isLoading: () => boolean;
|
|
88
36
|
isLoaded: () => boolean;
|
|
89
37
|
waitForAuth: () => Promise<void>;
|
|
90
38
|
getAuthToken: () => Promise<string | null>;
|
|
39
|
+
getAuthTokenSync: () => string | null;
|
|
91
40
|
getAuthHeaders: () => Promise<Record<string, string>>;
|
|
41
|
+
getAuthHeadersSync: () => Record<string, string>;
|
|
92
42
|
apiClient: {
|
|
93
|
-
get(
|
|
94
|
-
post(
|
|
95
|
-
put(
|
|
96
|
-
delete(
|
|
43
|
+
get<T = unknown>(path: string, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
|
|
44
|
+
post<T = unknown>(path: string, body?: unknown, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
|
|
45
|
+
put<T = unknown>(path: string, body?: unknown, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
|
|
46
|
+
delete<T = unknown>(path: string, options?: RequestInit): Promise<import("..").ApiResponse<T>>;
|
|
47
|
+
fetch(path: string, options?: RequestInit): Promise<Response>;
|
|
97
48
|
};
|
|
98
49
|
userManager: {
|
|
99
|
-
getUser()
|
|
100
|
-
getUserId()
|
|
50
|
+
getUser: () => SessionUser | null;
|
|
51
|
+
getUserId: () => string | null;
|
|
101
52
|
};
|
|
102
53
|
};
|
|
103
54
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/store/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/store/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,WAAW,GAAG,IAAI,CAEnF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAEhF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAEzE;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAEnE;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAElE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAErF;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIrF;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEhG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAKxF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;;;EAKjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE;IAC7C,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAChC,YAAY,EAAE,YAAY,CAAA;CAC3B;;;;;;;;;;;;;;;;;;;;;;EAiBA"}
|
package/dist/store/utils.js
CHANGED
|
@@ -1,198 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Store 工具函数
|
|
3
3
|
*/
|
|
4
4
|
export function getCurrentUser(authStore) {
|
|
5
5
|
return authStore.user.get();
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
* 获取当前用户ID
|
|
9
|
-
*/
|
|
10
7
|
export function getCurrentUserId(authStore) {
|
|
11
|
-
return authStore.user.get()?.id
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 安全获取当前用户ID
|
|
15
|
-
*/
|
|
16
|
-
export function getCurrentUserIdSafe(authStore) {
|
|
17
|
-
return getCurrentUserId(authStore);
|
|
8
|
+
return authStore.user.get()?.id ?? null;
|
|
18
9
|
}
|
|
19
|
-
/**
|
|
20
|
-
* 检查是否已认证
|
|
21
|
-
*/
|
|
22
10
|
export function isAuthenticated(authStore) {
|
|
23
11
|
return authStore.isAuthenticated.get();
|
|
24
12
|
}
|
|
25
|
-
/**
|
|
26
|
-
* 检查是否正在加载
|
|
27
|
-
*/
|
|
28
13
|
export function isLoading(authStore) {
|
|
29
14
|
return authStore.loading.get();
|
|
30
15
|
}
|
|
31
|
-
/**
|
|
32
|
-
* 检查是否已加载
|
|
33
|
-
*/
|
|
34
16
|
export function isLoaded(authStore) {
|
|
35
17
|
return authStore.isLoaded.get();
|
|
36
18
|
}
|
|
37
|
-
/**
|
|
38
|
-
* 等待认证完成
|
|
39
|
-
* 使用轮询方式检查认证状态(简单但有效)
|
|
40
|
-
*
|
|
41
|
-
* 注意:如果长时间未加载,Promise 不会自动 reject
|
|
42
|
-
* 建议在外层添加超时处理
|
|
43
|
-
*/
|
|
44
19
|
export async function waitForAuth(authStore) {
|
|
20
|
+
if (authStore.isLoaded.get())
|
|
21
|
+
return;
|
|
45
22
|
return new Promise((resolve) => {
|
|
46
|
-
|
|
47
|
-
if (authStore.isLoaded.get()) {
|
|
48
|
-
resolve();
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const checkAuth = () => {
|
|
23
|
+
const check = () => {
|
|
52
24
|
if (authStore.isLoaded.get()) {
|
|
53
25
|
resolve();
|
|
54
26
|
}
|
|
55
27
|
else {
|
|
56
|
-
setTimeout(
|
|
28
|
+
setTimeout(check, 100);
|
|
57
29
|
}
|
|
58
30
|
};
|
|
59
|
-
|
|
31
|
+
check();
|
|
60
32
|
});
|
|
61
33
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*/
|
|
65
|
-
export async function getAuthToken(authStore, tokenStorage, authActions, authClient) {
|
|
66
|
-
// 首先从存储中获取 token
|
|
67
|
-
const storedToken = tokenStorage.get();
|
|
68
|
-
if (storedToken) {
|
|
69
|
-
// 如果有 token 但没有用户信息,尝试获取 session
|
|
70
|
-
if (!authStore.user.get()) {
|
|
71
|
-
await authActions.fetchSessionWithToken(storedToken);
|
|
72
|
-
}
|
|
73
|
-
return storedToken;
|
|
74
|
-
}
|
|
75
|
-
// 如果没有存储的 token,尝试从 session 获取
|
|
76
|
-
const sessionData = await authClient.getSession();
|
|
77
|
-
const sessionToken = sessionData?.data?.session?.token || null;
|
|
78
|
-
if (sessionToken) {
|
|
79
|
-
tokenStorage.save(sessionToken);
|
|
80
|
-
}
|
|
81
|
-
return sessionToken;
|
|
34
|
+
export function getAuthTokenSync(tokenStorage) {
|
|
35
|
+
return tokenStorage.get();
|
|
82
36
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
export
|
|
87
|
-
const token =
|
|
88
|
-
if (!token)
|
|
37
|
+
export async function getAuthToken(tokenStorage) {
|
|
38
|
+
return tokenStorage.get();
|
|
39
|
+
}
|
|
40
|
+
export function getAuthHeadersSync(tokenStorage) {
|
|
41
|
+
const token = tokenStorage.get();
|
|
42
|
+
if (!token)
|
|
89
43
|
return {};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
44
|
+
return { Authorization: `Bearer ${encodeURIComponent(token)}` };
|
|
45
|
+
}
|
|
46
|
+
export async function getAuthHeaders(tokenStorage) {
|
|
47
|
+
return getAuthHeadersSync(tokenStorage);
|
|
94
48
|
}
|
|
95
|
-
/**
|
|
96
|
-
* 处理 401 响应
|
|
97
|
-
*/
|
|
98
49
|
export function handle401Response(response, authActions) {
|
|
99
50
|
if (response.status === 401) {
|
|
100
51
|
authActions.handleUnauthorized();
|
|
101
52
|
}
|
|
102
53
|
return response;
|
|
103
54
|
}
|
|
104
|
-
/**
|
|
105
|
-
* API 客户端工具
|
|
106
|
-
*/
|
|
107
|
-
export function createApiClient(authStore, tokenStorage, authActions, authClient) {
|
|
108
|
-
return {
|
|
109
|
-
async get(url, options) {
|
|
110
|
-
const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
|
|
111
|
-
const response = await fetch(url, {
|
|
112
|
-
...options,
|
|
113
|
-
method: "GET",
|
|
114
|
-
headers: {
|
|
115
|
-
...headers,
|
|
116
|
-
...options?.headers,
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
return handle401Response(response, authActions);
|
|
120
|
-
},
|
|
121
|
-
async post(url, body, options) {
|
|
122
|
-
const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
|
|
123
|
-
const response = await fetch(url, {
|
|
124
|
-
...options,
|
|
125
|
-
method: "POST",
|
|
126
|
-
headers: {
|
|
127
|
-
"Content-Type": "application/json",
|
|
128
|
-
...headers,
|
|
129
|
-
...options?.headers,
|
|
130
|
-
},
|
|
131
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
132
|
-
});
|
|
133
|
-
return handle401Response(response, authActions);
|
|
134
|
-
},
|
|
135
|
-
async put(url, body, options) {
|
|
136
|
-
const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
|
|
137
|
-
const response = await fetch(url, {
|
|
138
|
-
...options,
|
|
139
|
-
method: "PUT",
|
|
140
|
-
headers: {
|
|
141
|
-
"Content-Type": "application/json",
|
|
142
|
-
...headers,
|
|
143
|
-
...options?.headers,
|
|
144
|
-
},
|
|
145
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
146
|
-
});
|
|
147
|
-
return handle401Response(response, authActions);
|
|
148
|
-
},
|
|
149
|
-
async delete(url, options) {
|
|
150
|
-
const headers = await getAuthHeaders(authStore, tokenStorage, authActions, authClient);
|
|
151
|
-
const response = await fetch(url, {
|
|
152
|
-
...options,
|
|
153
|
-
method: "DELETE",
|
|
154
|
-
headers: {
|
|
155
|
-
...headers,
|
|
156
|
-
...options?.headers,
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
return handle401Response(response, authActions);
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* 用户管理器
|
|
165
|
-
*/
|
|
166
55
|
export function createUserManager(authStore) {
|
|
167
56
|
return {
|
|
168
|
-
getUser()
|
|
169
|
-
|
|
170
|
-
},
|
|
171
|
-
getUserId() {
|
|
172
|
-
return getCurrentUserId(authStore);
|
|
173
|
-
},
|
|
57
|
+
getUser: () => getCurrentUser(authStore),
|
|
58
|
+
getUserId: () => getCurrentUserId(authStore),
|
|
174
59
|
};
|
|
175
60
|
}
|
|
176
61
|
/**
|
|
177
|
-
*
|
|
178
|
-
* 这样就不需要在每个项目中重复包装工具函数
|
|
62
|
+
* 创建绑定好的工具函数集合
|
|
179
63
|
*/
|
|
180
64
|
export function createBoundAuthUtils(instance) {
|
|
181
|
-
const { authStore, tokenStorage,
|
|
65
|
+
const { authStore, tokenStorage, apiClient } = instance;
|
|
182
66
|
return {
|
|
183
|
-
// Store 访问
|
|
184
67
|
getCurrentUser: () => getCurrentUser(authStore),
|
|
185
68
|
getCurrentUserId: () => getCurrentUserId(authStore),
|
|
186
|
-
getCurrentUserIdSafe: () => getCurrentUserIdSafe(authStore),
|
|
187
69
|
isAuthenticated: () => isAuthenticated(authStore),
|
|
188
70
|
isLoading: () => isLoading(authStore),
|
|
189
71
|
isLoaded: () => isLoaded(authStore),
|
|
190
72
|
waitForAuth: () => waitForAuth(authStore),
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
getAuthHeaders: () => getAuthHeaders(
|
|
194
|
-
|
|
195
|
-
apiClient
|
|
73
|
+
getAuthToken: () => getAuthToken(tokenStorage),
|
|
74
|
+
getAuthTokenSync: () => getAuthTokenSync(tokenStorage),
|
|
75
|
+
getAuthHeaders: () => getAuthHeaders(tokenStorage),
|
|
76
|
+
getAuthHeadersSync: () => getAuthHeadersSync(tokenStorage),
|
|
77
|
+
apiClient,
|
|
196
78
|
userManager: createUserManager(authStore),
|
|
197
79
|
};
|
|
198
80
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 认证状态和配置类型
|
|
3
|
+
*/
|
|
4
|
+
import type { SessionUser } from "./user";
|
|
5
|
+
/** 更新用户请求 */
|
|
6
|
+
export interface UpdateUserRequest {
|
|
7
|
+
color?: string;
|
|
8
|
+
image?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Magic Link 登录请求 */
|
|
12
|
+
export interface MagicLinkRequest {
|
|
13
|
+
callbackURL?: string;
|
|
14
|
+
email: string;
|
|
15
|
+
errorCallbackURL?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
newUserCallbackURL?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Magic Link 登录方法签名 */
|
|
20
|
+
export type SignInWithMagicLink = (options: {
|
|
21
|
+
callbackURL: string;
|
|
22
|
+
email: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
newUserCallbackURL?: string;
|
|
25
|
+
}) => Promise<unknown>;
|
|
26
|
+
/** Email/Password 登录方法签名 */
|
|
27
|
+
export type SignInWithEmail = (credentials: {
|
|
28
|
+
email: string;
|
|
29
|
+
password: string;
|
|
30
|
+
}, options?: {
|
|
31
|
+
onError?: (context: {
|
|
32
|
+
error: Error;
|
|
33
|
+
}) => void;
|
|
34
|
+
onSuccess?: (context: {
|
|
35
|
+
response: Response;
|
|
36
|
+
}) => void;
|
|
37
|
+
}) => Promise<unknown>;
|
|
38
|
+
/** Email/Password 注册方法签名 */
|
|
39
|
+
export type SignUpWithEmail = (credentials: {
|
|
40
|
+
email: string;
|
|
41
|
+
name: string;
|
|
42
|
+
password: string;
|
|
43
|
+
}, options?: {
|
|
44
|
+
onError?: (context: {
|
|
45
|
+
error: Error;
|
|
46
|
+
}) => void;
|
|
47
|
+
onSuccess?: (context: {
|
|
48
|
+
response: Response;
|
|
49
|
+
}) => void;
|
|
50
|
+
}) => Promise<unknown>;
|
|
51
|
+
/** 伴生团队设置选项 */
|
|
52
|
+
export interface CompanionTeamOptions {
|
|
53
|
+
isNewUser?: boolean;
|
|
54
|
+
onComplete?: () => void;
|
|
55
|
+
onError?: (error: Error) => void;
|
|
56
|
+
}
|
|
57
|
+
/** Better Auth signIn 方法接口 */
|
|
58
|
+
export interface AuthClientSignIn {
|
|
59
|
+
email?: SignInWithEmail;
|
|
60
|
+
magicLink?: SignInWithMagicLink;
|
|
61
|
+
social: (options: {
|
|
62
|
+
callbackURL: string;
|
|
63
|
+
errorCallbackURL?: string;
|
|
64
|
+
newUserCallbackURL?: string;
|
|
65
|
+
provider: string;
|
|
66
|
+
}) => Promise<unknown>;
|
|
67
|
+
}
|
|
68
|
+
/** Better Auth signUp 方法接口 */
|
|
69
|
+
export interface AuthClientSignUp {
|
|
70
|
+
email?: SignUpWithEmail;
|
|
71
|
+
}
|
|
72
|
+
/** Better Auth 客户端接口 */
|
|
73
|
+
export interface AuthClientMethods {
|
|
74
|
+
signIn: AuthClientSignIn;
|
|
75
|
+
signOut: () => Promise<unknown>;
|
|
76
|
+
signUp?: AuthClientSignUp;
|
|
77
|
+
}
|
|
78
|
+
/** 认证状态(Legend State store) */
|
|
79
|
+
export interface AuthState {
|
|
80
|
+
error: string | null;
|
|
81
|
+
isAuthenticated: boolean;
|
|
82
|
+
isLoaded: boolean;
|
|
83
|
+
loading: boolean;
|
|
84
|
+
token: string | null;
|
|
85
|
+
user: SessionUser | null;
|
|
86
|
+
}
|
|
87
|
+
/** Better Auth 插件类型 */
|
|
88
|
+
export type BetterAuthPlugin = ReturnType<typeof import("better-auth/client/plugins").adminClient>;
|
|
89
|
+
/** 认证配置 */
|
|
90
|
+
export interface AuthConfig {
|
|
91
|
+
/** OneAuth API 基础 URL */
|
|
92
|
+
baseURL: string;
|
|
93
|
+
/** 获取 session 的端点路径 @default '/v1/auth/get-session' */
|
|
94
|
+
getSessionEndpoint?: string;
|
|
95
|
+
/** Better Auth 插件列表 */
|
|
96
|
+
plugins?: BetterAuthPlugin[];
|
|
97
|
+
/** 跳过错误时的 token 清除 @default false */
|
|
98
|
+
skipTokenCleanupOnError?: boolean;
|
|
99
|
+
/** Token 存储 key @default 'auth-token' */
|
|
100
|
+
tokenStorageKey?: string;
|
|
101
|
+
}
|
|
102
|
+
/** 默认配置类型 */
|
|
103
|
+
export type DefaultAuthConfig = Required<Pick<AuthConfig, "baseURL" | "getSessionEndpoint" | "tokenStorageKey">> & {
|
|
104
|
+
plugins: BetterAuthPlugin[];
|
|
105
|
+
skipTokenCleanupOnError: false;
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 类型定义导出
|
|
3
|
+
*/
|
|
4
|
+
export type { SessionUser, SessionUserMetadata, Session } from "./user";
|
|
5
|
+
export type { AuthClientMethods, AuthClientSignIn, AuthClientSignUp, AuthConfig, AuthState, BetterAuthPlugin, CompanionTeamOptions, DefaultAuthConfig, MagicLinkRequest, SignInWithEmail, SignInWithMagicLink, SignUpWithEmail, UpdateUserRequest, } from "./auth";
|
|
6
|
+
export type { Organization, FullOrganization, CreateOrganizationRequest, UpdateOrganizationRequest, DeleteOrganizationRequest, SetActiveOrganizationRequest, CheckSlugRequest, MemberRole, Member, MemberUser, MemberWithUser, RemoveMemberRequest, UpdateMemberRoleRequest, InvitationStatus, Invitation, InvitationDetail, InviteMemberRequest, CancelInvitationRequest, AcceptInvitationRequest, RejectInvitationRequest, InvitationResponse, } from "./organization";
|
|
7
|
+
export type { Team, CreateTeamRequest, UpdateTeamRequest, DeleteTeamRequest, SetActiveTeamRequest, TeamMember, AddTeamMemberRequest, RemoveTeamMemberRequest, ListTeamMembersRequest, } from "./team";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACvE,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,QAAQ,CAAA;AAGf,YAAY,EAEV,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAEhB,UAAU,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EAEvB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAGvB,YAAY,EAEV,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EAEpB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,QAAQ,CAAA"}
|