@choiceform/shared-auth 0.1.15 → 0.1.16

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,7 +1,17 @@
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
12
+ *
13
+ * 注意:在 React Router Framework 模式下,应使用 initializeAuth 函数
14
+ * 在 clientLoader 中调用,而不是使用此 hook
5
15
  */
6
16
  export declare function useAuthInit(auth: AuthInstance): void;
7
17
  //# sourceMappingURL=use-auth-init.d.ts.map
@@ -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,QAyC7C"}
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,CAoDzE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,QAQ7C"}
@@ -1,41 +1,69 @@
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
+ // URL 中的 token 可能被编码,尝试解码
19
+ try {
20
+ tokenFromUrl = decodeURIComponent(tokenFromUrl);
21
+ }
22
+ catch {
23
+ // 解码失败,使用原值
24
+ }
25
+ // 立即清理 URL 中的 token 参数(避免暴露)
26
+ urlParams.delete("token");
27
+ const newUrl = urlParams.toString()
28
+ ? `${window.location.pathname}?${urlParams.toString()}`
29
+ : window.location.pathname;
30
+ window.history.replaceState({}, "", newUrl);
31
+ // 使用 token 获取 session
32
+ try {
33
+ await authActions.fetchSessionWithToken(tokenFromUrl);
34
+ return authStore.isAuthenticated.get();
35
+ }
36
+ catch {
37
+ // Token 无效,继续检查 localStorage
38
+ }
39
+ }
40
+ // 检查 localStorage 中是否有存储的 token
41
+ const storedToken = tokenStorage.get();
42
+ if (storedToken) {
43
+ try {
44
+ await authActions.fetchSessionWithToken(storedToken);
45
+ return authStore.isAuthenticated.get();
46
+ }
47
+ catch {
48
+ // Token 无效,初始化为未认证状态
49
+ await authActions.initialize(null, true);
50
+ return false;
51
+ }
52
+ }
53
+ // 没有 token,标记为已加载
54
+ await authActions.initialize(null, true);
55
+ return false;
56
+ }
2
57
  /**
3
58
  * 认证初始化 hook
4
59
  * 在应用启动时检查 URL 中的 token 或 localStorage 中的 token
60
+ *
61
+ * 注意:在 React Router Framework 模式下,应使用 initializeAuth 函数
62
+ * 在 clientLoader 中调用,而不是使用此 hook
5
63
  */
6
64
  export function useAuthInit(auth) {
7
65
  useEffect(() => {
8
- async function initializeAuth() {
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) => {
66
+ initializeAuth(auth).catch((error) => {
39
67
  console.error("Failed to initialize auth:", error);
40
68
  // 即使认证初始化失败,也标记为已加载
41
69
  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
@@ -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;AAMnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,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
  // ============================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@choiceform/shared-auth",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Shared authentication package for Choiceform projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",