@choiceform/shared-auth 0.1.15 → 0.1.17
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.
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { AuthInstance } from "../core";
|
|
2
|
+
/**
|
|
3
|
+
* 初始化认证状态(非 hook 版本)
|
|
4
|
+
* 可在 React Router 的 clientLoader 中调用
|
|
5
|
+
*
|
|
6
|
+
* @returns 是否已认证
|
|
7
|
+
*/
|
|
8
|
+
export declare function initializeAuth(auth: AuthInstance): Promise<boolean>;
|
|
2
9
|
/**
|
|
3
10
|
* 认证初始化 hook
|
|
4
11
|
* 在应用启动时检查 URL 中的 token 或 localStorage 中的 token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auth-init.d.ts","sourceRoot":"","sources":["../../src/hooks/use-auth-init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"use-auth-init.d.ts","sourceRoot":"","sources":["../../src/hooks/use-auth-init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,QAQ7C"}
|
|
@@ -1,41 +1,62 @@
|
|
|
1
1
|
import { useEffect } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* 初始化认证状态(非 hook 版本)
|
|
4
|
+
* 可在 React Router 的 clientLoader 中调用
|
|
5
|
+
*
|
|
6
|
+
* @returns 是否已认证
|
|
7
|
+
*/
|
|
8
|
+
export async function initializeAuth(auth) {
|
|
9
|
+
const { authActions, tokenStorage, authStore } = auth;
|
|
10
|
+
// 如果已经初始化,直接返回
|
|
11
|
+
if (authStore.isLoaded.get()) {
|
|
12
|
+
return authStore.isAuthenticated.get();
|
|
13
|
+
}
|
|
14
|
+
// 检查 URL 中的 token
|
|
15
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
16
|
+
let tokenFromUrl = urlParams.get("token");
|
|
17
|
+
if (tokenFromUrl) {
|
|
18
|
+
if (decodeURIComponent(tokenFromUrl) === tokenFromUrl) {
|
|
19
|
+
tokenFromUrl = encodeURIComponent(tokenFromUrl);
|
|
20
|
+
}
|
|
21
|
+
// 立即清理 URL 中的 token 参数(避免暴露)
|
|
22
|
+
urlParams.delete("token");
|
|
23
|
+
const newUrl = urlParams.toString()
|
|
24
|
+
? `${window.location.pathname}?${urlParams.toString()}`
|
|
25
|
+
: window.location.pathname;
|
|
26
|
+
window.history.replaceState({}, "", newUrl);
|
|
27
|
+
// 使用 token 获取 session
|
|
28
|
+
try {
|
|
29
|
+
await authActions.fetchSessionWithToken(tokenFromUrl);
|
|
30
|
+
return authStore.isAuthenticated.get();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Token 无效,继续检查 localStorage
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// 检查 localStorage 中是否有存储的 token
|
|
37
|
+
const storedToken = tokenStorage.get();
|
|
38
|
+
if (storedToken) {
|
|
39
|
+
try {
|
|
40
|
+
await authActions.fetchSessionWithToken(storedToken);
|
|
41
|
+
return authStore.isAuthenticated.get();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Token 无效,初始化为未认证状态
|
|
45
|
+
await authActions.initialize(null, true);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 没有 token,标记为已加载
|
|
50
|
+
await authActions.initialize(null, true);
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
2
53
|
/**
|
|
3
54
|
* 认证初始化 hook
|
|
4
55
|
* 在应用启动时检查 URL 中的 token 或 localStorage 中的 token
|
|
5
56
|
*/
|
|
6
57
|
export function useAuthInit(auth) {
|
|
7
58
|
useEffect(() => {
|
|
8
|
-
|
|
9
|
-
const { authActions, tokenStorage } = auth;
|
|
10
|
-
// 检查 URL 中的 token
|
|
11
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
12
|
-
let tokenFromUrl = urlParams.get("token");
|
|
13
|
-
if (tokenFromUrl) {
|
|
14
|
-
if (decodeURIComponent(tokenFromUrl) === tokenFromUrl) {
|
|
15
|
-
tokenFromUrl = encodeURIComponent(tokenFromUrl);
|
|
16
|
-
}
|
|
17
|
-
// 立即清理 URL 中的 token 参数(避免暴露)
|
|
18
|
-
urlParams.delete("token");
|
|
19
|
-
const newUrl = urlParams.toString()
|
|
20
|
-
? `${window.location.pathname}?${urlParams.toString()}`
|
|
21
|
-
: window.location.pathname;
|
|
22
|
-
window.history.replaceState({}, "", newUrl);
|
|
23
|
-
// 使用 token 获取 session
|
|
24
|
-
await authActions.fetchSessionWithToken(tokenFromUrl);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
// 检查 localStorage 中是否有存储的 token
|
|
28
|
-
const storedToken = tokenStorage.get();
|
|
29
|
-
if (storedToken) {
|
|
30
|
-
await authActions.fetchSessionWithToken(storedToken);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
// 没有 token,标记为已加载
|
|
34
|
-
await authActions.initialize(null, true);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
initializeAuth().catch((error) => {
|
|
59
|
+
initializeAuth(auth).catch((error) => {
|
|
39
60
|
console.error("Failed to initialize auth:", error);
|
|
40
61
|
// 即使认证初始化失败,也标记为已加载
|
|
41
62
|
auth.authActions.initialize(null, true);
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,6 @@ export { createApiClient, createAuthApi, createOrganizationApi, createTeamApi, p
|
|
|
14
14
|
export type { ApiClient, ApiClientConfig, ApiResponse, TokenStorage, UnauthorizedHandler, AuthApi, OrganizationApi, TeamApi, } from "./api";
|
|
15
15
|
export { setupCompanionTeam } from "./services";
|
|
16
16
|
export { getEnvVar, getAuthBaseUrl, extractSessionUser } from "./utils";
|
|
17
|
-
export { useAuthInit } from "./hooks/use-auth-init";
|
|
17
|
+
export { useAuthInit, initializeAuth } from "./hooks/use-auth-init";
|
|
18
18
|
export { createAuthClientFromConfig } from "./lib/auth-client";
|
|
19
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAM5C,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAEhB,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAElB,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAMhB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,MAAM,eAAe,CAAA;AAMtB,OAAO,EACL,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,OAAO,CAAA;AAEd,YAAY,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,OAAO,GACR,MAAM,OAAO,CAAA;AAMd,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAM/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAMvE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAM5C,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAEhB,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAElB,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAMhB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,MAAM,eAAe,CAAA;AAMtB,OAAO,EACL,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,OAAO,CAAA;AAEd,YAAY,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,OAAO,GACR,MAAM,OAAO,CAAA;AAMd,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAM/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAMvE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ export { getEnvVar, getAuthBaseUrl, extractSessionUser } from "./utils";
|
|
|
30
30
|
// ============================================================
|
|
31
31
|
// Hooks
|
|
32
32
|
// ============================================================
|
|
33
|
-
export { useAuthInit } from "./hooks/use-auth-init";
|
|
33
|
+
export { useAuthInit, initializeAuth } from "./hooks/use-auth-init";
|
|
34
34
|
// ============================================================
|
|
35
35
|
// Better Auth Client
|
|
36
36
|
// ============================================================
|