@thinkingcat/auth-utils 2.0.12 → 2.0.14

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/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './utils/server';
5
5
  export * from './utils/redirect';
6
6
  export * from './utils/path';
7
7
  export * from './utils/license';
8
+ export * from './utils/device-id';
8
9
  export * from './core/jwt';
9
10
  export * from './core/cookies';
10
11
  export * from './core/auth-response';
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ __exportStar(require("./utils/server"), exports);
21
21
  __exportStar(require("./utils/redirect"), exports);
22
22
  __exportStar(require("./utils/path"), exports);
23
23
  __exportStar(require("./utils/license"), exports);
24
+ __exportStar(require("./utils/device-id"), exports);
24
25
  __exportStar(require("./core/jwt"), exports);
25
26
  __exportStar(require("./core/cookies"), exports);
26
27
  __exportStar(require("./core/auth-response"), exports);
@@ -14,6 +14,7 @@ export declare function createInitialJWTToken(token: JWT, user: {
14
14
  decryptedEmail?: string | null;
15
15
  decryptedPhone?: string | null;
16
16
  refreshToken?: string | null;
17
+ deviceId?: string | null;
17
18
  }, account?: {
18
19
  serviceId?: string;
19
20
  } | null): JWT;
@@ -55,6 +55,7 @@ function createInitialJWTToken(token, user, account) {
55
55
  decryptedEmail: user.decryptedEmail ?? undefined,
56
56
  decryptedPhone: user.decryptedPhone ?? undefined,
57
57
  refreshToken: user.refreshToken ?? undefined,
58
+ deviceId: user.deviceId ?? undefined,
58
59
  accessTokenExpires: Date.now() + (15 * 60 * 1000),
59
60
  serviceId: account?.serviceId ?? undefined,
60
61
  };
@@ -132,6 +133,7 @@ async function handleJWTCallback(token, user, account, options) {
132
133
  return {
133
134
  ...newJWT,
134
135
  refreshToken,
136
+ deviceId: newJWT.deviceId || token.deviceId, // Preserve deviceId
135
137
  accessTokenExpires: Date.now() + (15 * 60 * 1000),
136
138
  };
137
139
  }
@@ -36,5 +36,6 @@ function mapTokenToSession(session, token) {
36
36
  user.isPasswordReset = token.isPasswordReset || false;
37
37
  user.decryptedEmail = token.decryptedEmail;
38
38
  user.decryptedPhone = token.decryptedPhone;
39
+ user.deviceId = token.deviceId;
39
40
  return session;
40
41
  }
package/dist/sso/api.d.ts CHANGED
@@ -21,4 +21,5 @@ export declare function refreshSSOToken(refreshToken: string, options: {
21
21
  export declare function getRefreshTokenFromSSO(userId: string, accessToken: string, options: {
22
22
  ssoBaseURL: string;
23
23
  authServiceKey?: string;
24
+ serviceId?: string;
24
25
  }): Promise<string | null>;
package/dist/sso/api.js CHANGED
@@ -58,7 +58,7 @@ async function refreshSSOToken(refreshToken, options) {
58
58
  * SSO 서버에서 사용자의 refresh token을 가져오는 함수
59
59
  */
60
60
  async function getRefreshTokenFromSSO(userId, accessToken, options) {
61
- const { ssoBaseURL, authServiceKey } = options;
61
+ const { ssoBaseURL, authServiceKey, serviceId } = options;
62
62
  if (!authServiceKey) {
63
63
  return null;
64
64
  }
@@ -71,7 +71,8 @@ async function getRefreshTokenFromSSO(userId, accessToken, options) {
71
71
  },
72
72
  body: JSON.stringify({
73
73
  userId,
74
- accessToken
74
+ accessToken,
75
+ serviceId
75
76
  }),
76
77
  });
77
78
  const refreshResult = await refreshResponse.json();
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Device ID 관리 유틸리티
3
+ * 브라우저별로 고유한 ID를 생성하고 localStorage에 저장
4
+ */
5
+ /**
6
+ * 현재 기기의 고유 ID를 가져옵니다.
7
+ * localStorage에 저장된 ID가 있으면 반환하고, 없으면 새로 생성합니다.
8
+ *
9
+ * @param storageKey - localStorage 키 (기본값: 'device_id')
10
+ * @returns {string} 기기 고유 ID
11
+ */
12
+ export declare function getDeviceId(storageKey?: string): string;
13
+ /**
14
+ * 새로운 기기 ID를 생성합니다.
15
+ * 형식: {8-char-random} (예: a3f9k2m1)
16
+ *
17
+ * @returns {string} 생성된 기기 ID
18
+ */
19
+ export declare function generateDeviceId(): string;
20
+ /**
21
+ * 현재 기기 ID를 삭제합니다.
22
+ * 주로 테스트나 디버깅 용도로 사용
23
+ *
24
+ * @param storageKey - localStorage 키 (기본값: 'device_id')
25
+ */
26
+ export declare function clearDeviceId(storageKey?: string): void;
27
+ /**
28
+ * 기기 정보를 수집합니다 (선택적)
29
+ * 더 정교한 fingerprinting이 필요한 경우 사용
30
+ *
31
+ * @returns {object} 기기 정보
32
+ */
33
+ export declare function getDeviceInfo(): {
34
+ userAgent?: undefined;
35
+ language?: undefined;
36
+ platform?: undefined;
37
+ screenResolution?: undefined;
38
+ timezone?: undefined;
39
+ } | {
40
+ userAgent: any;
41
+ language: any;
42
+ platform: any;
43
+ screenResolution: string;
44
+ timezone: string;
45
+ };
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * Device ID 관리 유틸리티
4
+ * 브라우저별로 고유한 ID를 생성하고 localStorage에 저장
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getDeviceId = getDeviceId;
8
+ exports.generateDeviceId = generateDeviceId;
9
+ exports.clearDeviceId = clearDeviceId;
10
+ exports.getDeviceInfo = getDeviceInfo;
11
+ /**
12
+ * 현재 기기의 고유 ID를 가져옵니다.
13
+ * localStorage에 저장된 ID가 있으면 반환하고, 없으면 새로 생성합니다.
14
+ *
15
+ * @param storageKey - localStorage 키 (기본값: 'device_id')
16
+ * @returns {string} 기기 고유 ID
17
+ */
18
+ function getDeviceId(storageKey = 'device_id') {
19
+ // 서버 사이드에서는 빈 문자열 반환
20
+ if (typeof globalThis.window === 'undefined') {
21
+ return '';
22
+ }
23
+ try {
24
+ // localStorage에서 기존 ID 확인
25
+ const storage = globalThis.localStorage;
26
+ let deviceId = storage?.getItem(storageKey);
27
+ if (!deviceId) {
28
+ // 없으면 새로 생성
29
+ deviceId = generateDeviceId();
30
+ storage?.setItem(storageKey, deviceId);
31
+ console.log(`[DeviceID] New device ID generated: ${deviceId}`);
32
+ }
33
+ return deviceId;
34
+ }
35
+ catch (error) {
36
+ // localStorage 접근 실패 시 (프라이빗 모드 등)
37
+ console.warn('[DeviceID] Failed to access localStorage:', error);
38
+ return generateDeviceId();
39
+ }
40
+ }
41
+ /**
42
+ * 새로운 기기 ID를 생성합니다.
43
+ * 형식: {8-char-random} (예: a3f9k2m1)
44
+ *
45
+ * @returns {string} 생성된 기기 ID
46
+ */
47
+ function generateDeviceId() {
48
+ // 8자리 랜덤 문자열 생성
49
+ return Math.random().toString(36).substring(2, 10);
50
+ }
51
+ /**
52
+ * 현재 기기 ID를 삭제합니다.
53
+ * 주로 테스트나 디버깅 용도로 사용
54
+ *
55
+ * @param storageKey - localStorage 키 (기본값: 'device_id')
56
+ */
57
+ function clearDeviceId(storageKey = 'device_id') {
58
+ if (typeof globalThis.window === 'undefined') {
59
+ return;
60
+ }
61
+ try {
62
+ const storage = globalThis.localStorage;
63
+ storage?.removeItem(storageKey);
64
+ console.log('[DeviceID] Device ID cleared');
65
+ }
66
+ catch (error) {
67
+ console.warn('[DeviceID] Failed to clear device ID:', error);
68
+ }
69
+ }
70
+ /**
71
+ * 기기 정보를 수집합니다 (선택적)
72
+ * 더 정교한 fingerprinting이 필요한 경우 사용
73
+ *
74
+ * @returns {object} 기기 정보
75
+ */
76
+ function getDeviceInfo() {
77
+ if (typeof globalThis.window === 'undefined') {
78
+ return {};
79
+ }
80
+ const nav = globalThis.navigator;
81
+ const scr = globalThis.screen;
82
+ return {
83
+ userAgent: nav?.userAgent || '',
84
+ language: nav?.language || '',
85
+ platform: nav?.platform || '',
86
+ screenResolution: scr ? `${scr.width}x${scr.height}` : '',
87
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
88
+ };
89
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkingcat/auth-utils",
3
- "version": "2.0.12",
3
+ "version": "2.0.14",
4
4
  "description": "Authentication utilities for ThinkingCat SSO services with conditional logging",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",