@thetechfossil/auth2 1.2.1 → 1.2.2

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.
@@ -33,7 +33,6 @@ interface RegisterData {
33
33
  name: string;
34
34
  email: string;
35
35
  password: string;
36
- frontendBaseUrl?: string;
37
36
  }
38
37
  interface UpdateUserData {
39
38
  name: string;
@@ -53,6 +52,28 @@ interface AuthConfig {
53
52
  token?: string;
54
53
  csrfEnabled?: boolean;
55
54
  }
55
+ interface Session {
56
+ id: string;
57
+ userId: string;
58
+ deviceInfo?: string;
59
+ ipAddress?: string;
60
+ lastActive: string;
61
+ createdAt: string;
62
+ }
63
+ interface MFASetup {
64
+ success: boolean;
65
+ qrCode?: string;
66
+ secret?: string;
67
+ message: string;
68
+ }
69
+ interface AuditLog {
70
+ id: string;
71
+ userId: string;
72
+ action: string;
73
+ details?: any;
74
+ ipAddress?: string;
75
+ timestamp: string;
76
+ }
56
77
  interface UseAuthReturn {
57
78
  user: User | null;
58
79
  isAuthenticated: boolean;
@@ -71,6 +92,20 @@ interface UseAuthReturn {
71
92
  unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;
72
93
  csrfToken: string | null;
73
94
  refreshCsrfToken: () => Promise<void>;
95
+ changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;
96
+ updateAvatar: (avatar: string) => Promise<AuthResponse>;
97
+ requestEmailChange: (newEmail: string) => Promise<AuthResponse>;
98
+ verifyEmailChange: (token: string) => Promise<AuthResponse>;
99
+ generate2FA: () => Promise<MFASetup>;
100
+ enable2FA: (token: string) => Promise<AuthResponse>;
101
+ disable2FA: (token: string) => Promise<AuthResponse>;
102
+ validate2FA: (token: string) => Promise<AuthResponse>;
103
+ getSessions: () => Promise<{
104
+ success: boolean;
105
+ sessions: Session[];
106
+ }>;
107
+ revokeSession: (sessionId: string) => Promise<AuthResponse>;
108
+ revokeAllSessions: () => Promise<AuthResponse>;
74
109
  }
75
110
 
76
111
  declare class AuthService {
@@ -100,11 +135,39 @@ declare class AuthService {
100
135
  getUserById(id: string): Promise<User>;
101
136
  forgotPassword(email: string): Promise<AuthResponse>;
102
137
  resetPassword(token: string, password: string): Promise<AuthResponse>;
138
+ changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse>;
139
+ updateAvatar(avatar: string): Promise<AuthResponse>;
140
+ requestEmailChange(newEmail: string): Promise<AuthResponse>;
141
+ verifyEmailChange(token: string): Promise<AuthResponse>;
142
+ generate2FA(): Promise<{
143
+ success: boolean;
144
+ qrCode?: string;
145
+ secret?: string;
146
+ message: string;
147
+ }>;
148
+ enable2FA(token: string): Promise<AuthResponse>;
149
+ disable2FA(token: string): Promise<AuthResponse>;
150
+ validate2FA(token: string): Promise<AuthResponse>;
151
+ getSessions(): Promise<{
152
+ success: boolean;
153
+ sessions: any[];
154
+ }>;
155
+ revokeSession(sessionId: string): Promise<AuthResponse>;
156
+ revokeAllSessions(): Promise<AuthResponse>;
157
+ getAuditLogs(filters?: any): Promise<{
158
+ success: boolean;
159
+ logs: any[];
160
+ }>;
161
+ adminVerifyUser(userId: string): Promise<AuthResponse>;
162
+ adminForcePasswordReset(userId: string): Promise<AuthResponse>;
163
+ adminSuspendUser(userId: string): Promise<AuthResponse>;
164
+ adminActivateUser(userId: string): Promise<AuthResponse>;
103
165
  }
104
166
 
105
167
  declare class HttpClient {
106
168
  private axiosInstance;
107
169
  private csrfToken;
170
+ private frontendBaseUrl;
108
171
  constructor(baseUrl: string, defaultHeaders?: Record<string, string>);
109
172
  get<T>(endpoint: string, headers?: Record<string, string>): Promise<T>;
110
173
  post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T>;
@@ -115,6 +178,9 @@ declare class HttpClient {
115
178
  setCsrfToken(token: string): void;
116
179
  getCsrfToken(): string | null;
117
180
  removeCsrfToken(): void;
181
+ setFrontendBaseUrl(url: string): void;
182
+ getFrontendBaseUrl(): string | null;
183
+ removeFrontendBaseUrl(): void;
118
184
  private refreshCsrfToken;
119
185
  }
120
186
 
@@ -139,4 +205,4 @@ declare class NextServerAuth extends AuthClient {
139
205
  static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth;
140
206
  }
141
207
 
142
- export { AuthClient, AuthConfig, AuthResponse, AuthService, CsrfTokenResponse, HttpClient, LinkedAccount, LoginData, NextServerAuth, OAuthConfig, OAuthProvider, RegisterData, UpdateUserData, UseAuthReturn, User, VerifyData };
208
+ export { AuditLog, AuthClient, AuthConfig, AuthResponse, AuthService, CsrfTokenResponse, HttpClient, LinkedAccount, LoginData, MFASetup, NextServerAuth, OAuthConfig, OAuthProvider, RegisterData, Session, UpdateUserData, UseAuthReturn, User, VerifyData };
@@ -10,6 +10,7 @@ var axios__default = /*#__PURE__*/_interopDefault(axios);
10
10
  var HttpClient = class {
11
11
  constructor(baseUrl, defaultHeaders = {}) {
12
12
  this.csrfToken = null;
13
+ this.frontendBaseUrl = null;
13
14
  this.axiosInstance = axios__default.default.create({
14
15
  baseURL: baseUrl.replace(/\/$/, ""),
15
16
  headers: {
@@ -26,6 +27,9 @@ var HttpClient = class {
26
27
  if (this.csrfToken && ["post", "put", "delete", "patch"].includes(config.method?.toLowerCase() || "")) {
27
28
  config.headers["x-csrf-token"] = this.csrfToken;
28
29
  }
30
+ if (this.frontendBaseUrl) {
31
+ config.headers["X-Frontend-URL"] = this.frontendBaseUrl;
32
+ }
29
33
  return config;
30
34
  },
31
35
  (error) => Promise.reject(error)
@@ -81,6 +85,15 @@ var HttpClient = class {
81
85
  removeCsrfToken() {
82
86
  this.csrfToken = null;
83
87
  }
88
+ setFrontendBaseUrl(url) {
89
+ this.frontendBaseUrl = url;
90
+ }
91
+ getFrontendBaseUrl() {
92
+ return this.frontendBaseUrl;
93
+ }
94
+ removeFrontendBaseUrl() {
95
+ this.frontendBaseUrl = null;
96
+ }
84
97
  async refreshCsrfToken() {
85
98
  try {
86
99
  const response = await this.axiosInstance.get("/api/v1/auth/csrf-token");
@@ -103,6 +116,12 @@ var AuthService = class {
103
116
  };
104
117
  this.httpClient = new HttpClient(this.config.baseUrl);
105
118
  this.loadTokenFromStorage();
119
+ if (typeof window !== "undefined") {
120
+ const frontendBaseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_APP_URL || window.location.origin;
121
+ if (frontendBaseUrl) {
122
+ this.httpClient.setFrontendBaseUrl(frontendBaseUrl);
123
+ }
124
+ }
106
125
  if (this.config.csrfEnabled && typeof window !== "undefined") {
107
126
  this.refreshCsrfToken();
108
127
  }
@@ -219,11 +238,7 @@ var AuthService = class {
219
238
  throw new Error(response.message || "Login failed");
220
239
  }
221
240
  async register(data) {
222
- const registerData = { ...data };
223
- if (!registerData.frontendBaseUrl && typeof window !== "undefined") {
224
- registerData.frontendBaseUrl = process.env.FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_APP_URL || window.location.origin;
225
- }
226
- const response = await this.httpClient.post("/api/v1/auth/register", registerData);
241
+ const response = await this.httpClient.post("/api/v1/auth/register", data);
227
242
  if (response.success && response.message === "Registration data saved. Verification email sent. Please check your inbox.") {
228
243
  return response;
229
244
  }
@@ -239,15 +254,33 @@ var AuthService = class {
239
254
  return response;
240
255
  }
241
256
  async verifyEmailToken(token) {
242
- const response = await this.httpClient.get(`/api/v1/auth/verify-email?token=${token}`);
243
- if (response.success && response.token) {
244
- this.token = response.token;
245
- this.httpClient.setAuthToken(response.token);
246
- this.saveTokenToStorage(response.token);
257
+ try {
258
+ const response = await this.httpClient.get(`/api/v1/auth/verify-email?token=${token}`);
259
+ if (response.success && response.token) {
260
+ this.token = response.token;
261
+ this.httpClient.setAuthToken(response.token);
262
+ this.saveTokenToStorage(response.token);
263
+ }
264
+ return response;
265
+ } catch (error) {
266
+ if (error.response?.data) {
267
+ return {
268
+ success: false,
269
+ message: error.response.data.message || "Email verification failed"
270
+ };
271
+ }
272
+ return {
273
+ success: false,
274
+ message: error.message || "Network error occurred"
275
+ };
247
276
  }
248
- return response;
249
277
  }
250
278
  async logout() {
279
+ try {
280
+ await this.httpClient.post("/api/v1/auth/logout", {});
281
+ } catch (error) {
282
+ console.warn("Failed to call logout endpoint:", error);
283
+ }
251
284
  this.token = null;
252
285
  this.httpClient.removeAuthToken();
253
286
  this.httpClient.removeCsrfToken();
@@ -284,9 +317,6 @@ var AuthService = class {
284
317
  return response.user;
285
318
  }
286
319
  async forgotPassword(email) {
287
- if (typeof window !== "undefined") {
288
- process.env.FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_APP_URL || window.location.origin;
289
- }
290
320
  const response = await this.httpClient.post("/api/v1/auth/forgot-password", { email });
291
321
  return response;
292
322
  }
@@ -294,6 +324,142 @@ var AuthService = class {
294
324
  const response = await this.httpClient.post("/api/v1/auth/reset-password", { token, password });
295
325
  return response;
296
326
  }
327
+ async changePassword(oldPassword, newPassword) {
328
+ if (!this.token) {
329
+ throw new Error("Not authenticated");
330
+ }
331
+ const response = await this.httpClient.post("/api/v1/user/change-password", {
332
+ oldPassword,
333
+ newPassword
334
+ });
335
+ return response;
336
+ }
337
+ async updateAvatar(avatar) {
338
+ if (!this.token) {
339
+ throw new Error("Not authenticated");
340
+ }
341
+ const response = await this.httpClient.post("/api/v1/user/update/avatar", { avatar });
342
+ if (response.success && response.token) {
343
+ this.token = response.token;
344
+ this.httpClient.setAuthToken(response.token);
345
+ this.saveTokenToStorage(response.token);
346
+ }
347
+ return response;
348
+ }
349
+ async requestEmailChange(newEmail) {
350
+ if (!this.token) {
351
+ throw new Error("Not authenticated");
352
+ }
353
+ const response = await this.httpClient.post("/api/v1/user/request-email-change", {
354
+ newEmail
355
+ });
356
+ return response;
357
+ }
358
+ async verifyEmailChange(token) {
359
+ const response = await this.httpClient.get(`/api/v1/user/verify-email-change?token=${token}`);
360
+ if (response.success && response.token) {
361
+ this.token = response.token;
362
+ this.httpClient.setAuthToken(response.token);
363
+ this.saveTokenToStorage(response.token);
364
+ }
365
+ return response;
366
+ }
367
+ // 2FA / MFA Methods
368
+ async generate2FA() {
369
+ if (!this.token) {
370
+ throw new Error("Not authenticated");
371
+ }
372
+ const response = await this.httpClient.post(
373
+ "/api/v1/mfa/generate",
374
+ {}
375
+ );
376
+ return response;
377
+ }
378
+ async enable2FA(token) {
379
+ if (!this.token) {
380
+ throw new Error("Not authenticated");
381
+ }
382
+ const response = await this.httpClient.post("/api/v1/mfa/enable", { token });
383
+ return response;
384
+ }
385
+ async disable2FA(token) {
386
+ if (!this.token) {
387
+ throw new Error("Not authenticated");
388
+ }
389
+ const response = await this.httpClient.post("/api/v1/mfa/disable", { token });
390
+ return response;
391
+ }
392
+ async validate2FA(token) {
393
+ if (!this.token) {
394
+ throw new Error("Not authenticated");
395
+ }
396
+ const response = await this.httpClient.post("/api/v1/mfa/validate", { token });
397
+ return response;
398
+ }
399
+ // Session Management Methods
400
+ async getSessions() {
401
+ if (!this.token) {
402
+ throw new Error("Not authenticated");
403
+ }
404
+ const response = await this.httpClient.get("/api/v1/session");
405
+ return response;
406
+ }
407
+ async revokeSession(sessionId) {
408
+ if (!this.token) {
409
+ throw new Error("Not authenticated");
410
+ }
411
+ const response = await this.httpClient.delete(`/api/v1/session/${sessionId}`);
412
+ return response;
413
+ }
414
+ async revokeAllSessions() {
415
+ if (!this.token) {
416
+ throw new Error("Not authenticated");
417
+ }
418
+ const response = await this.httpClient.delete("/api/v1/session/revoke/all");
419
+ this.token = null;
420
+ this.httpClient.removeAuthToken();
421
+ this.removeTokenFromStorage();
422
+ return response;
423
+ }
424
+ // Admin Methods
425
+ async getAuditLogs(filters) {
426
+ if (!this.token) {
427
+ throw new Error("Not authenticated");
428
+ }
429
+ const response = await this.httpClient.get(
430
+ "/api/v1/admin/audit-logs",
431
+ filters
432
+ );
433
+ return response;
434
+ }
435
+ async adminVerifyUser(userId) {
436
+ if (!this.token) {
437
+ throw new Error("Not authenticated");
438
+ }
439
+ const response = await this.httpClient.post(`/api/v1/admin/verify-user/${userId}`, {});
440
+ return response;
441
+ }
442
+ async adminForcePasswordReset(userId) {
443
+ if (!this.token) {
444
+ throw new Error("Not authenticated");
445
+ }
446
+ const response = await this.httpClient.post(`/api/v1/admin/force-password-reset/${userId}`, {});
447
+ return response;
448
+ }
449
+ async adminSuspendUser(userId) {
450
+ if (!this.token) {
451
+ throw new Error("Not authenticated");
452
+ }
453
+ const response = await this.httpClient.post(`/api/v1/admin/suspend-user/${userId}`, {});
454
+ return response;
455
+ }
456
+ async adminActivateUser(userId) {
457
+ if (!this.token) {
458
+ throw new Error("Not authenticated");
459
+ }
460
+ const response = await this.httpClient.post(`/api/v1/admin/activate-user/${userId}`, {});
461
+ return response;
462
+ }
297
463
  };
298
464
 
299
465
  // src/node/auth-client.ts
@@ -304,11 +470,11 @@ var AuthClient = class extends AuthService {
304
470
  // Override methods that require browser-specific features
305
471
  // For Node.js, token persistence must be handled manually
306
472
  async register(data) {
307
- const registerData = { ...data };
308
- if (!registerData.frontendBaseUrl) {
309
- registerData.frontendBaseUrl = process.env.FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL;
473
+ const frontendBaseUrl = process.env.FRONTEND_BASE_URL || process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL;
474
+ if (frontendBaseUrl) {
475
+ this["httpClient"].setFrontendBaseUrl(frontendBaseUrl);
310
476
  }
311
- const response = await this["httpClient"].post("/api/v1/auth/register", registerData);
477
+ const response = await this["httpClient"].post("/api/v1/auth/register", data);
312
478
  if (response.success && response.message === "Registration data saved. Verification email sent. Please check your inbox.") {
313
479
  return response;
314
480
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/node/auth-client.ts","../src/nextjs/server-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.axiosInstance = axios.create({\r\n baseURL: baseUrl.replace(/\\/$/, ''),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token\r\n this.axiosInstance.interceptors.request.use(\r\n (config) => {\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '')) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize CSRF token if enabled\r\n if (this.config.csrfEnabled && typeof window !== 'undefined') {\r\n this.refreshCsrfToken();\r\n }\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n const registerData = { ...data };\r\n if (!registerData.frontendBaseUrl && typeof window !== 'undefined') {\r\n registerData.frontendBaseUrl =\r\n process.env.FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', registerData);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/user', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n let frontendBaseUrl: string | undefined;\r\n if (typeof window !== 'undefined') {\r\n frontendBaseUrl =\r\n process.env.FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n}","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Automatically add frontend base URL if not provided\r\n const registerData = { ...data };\r\n if (!registerData.frontendBaseUrl) {\r\n // Check for environment variable\r\n registerData.frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', registerData);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}","import { AuthClient } from '../node/auth-client';\r\nimport { AuthConfig, User, RegisterData } from '../types';\r\n\r\n// Server-side authentication utility for Next.js\r\nexport class NextServerAuth extends AuthClient {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Parse token from request headers\r\n public static parseTokenFromHeaders(headers: Headers): string | null {\r\n const authHeader = headers.get('authorization');\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n return null;\r\n }\r\n return authHeader.substring(7); // Remove 'Bearer ' prefix\r\n }\r\n\r\n // Parse token from cookies\r\n public static parseTokenFromCookies(cookies: string): string | null {\r\n const cookieArray = cookies.split(';');\r\n for (const cookie of cookieArray) {\r\n const [name, value] = cookie.trim().split('=');\r\n if (name === 'auth_token') {\r\n return decodeURIComponent(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Parse token from Next.js request object\r\n public static parseTokenFromRequest(req: any): string | null {\r\n // Try to get token from headers first\r\n if (req.headers) {\r\n const authHeader = req.headers.authorization || req.headers.Authorization;\r\n if (authHeader && authHeader.startsWith('Bearer ')) {\r\n return authHeader.substring(7);\r\n }\r\n }\r\n\r\n // Try to get token from cookies\r\n if (req.cookies) {\r\n return req.cookies.auth_token || null;\r\n }\r\n\r\n // Try to get token from cookie header\r\n if (req.headers && req.headers.cookie) {\r\n return this.parseTokenFromCookies(req.headers.cookie);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Verify token and get user\r\n public async verifyToken(token: string): Promise<User | null> {\r\n try {\r\n // Set the token for this request\r\n (this as any)['httpClient'].setAuthToken(token);\r\n \r\n // Get user profile to verify token\r\n const user = await this.getProfile();\r\n return user;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Create authenticated client with token\r\n public static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth {\r\n const client = new NextServerAuth(config);\r\n (client as any)['httpClient'].setAuthToken(token);\r\n (client as any)['token'] = token;\r\n return client;\r\n }\r\n}"]}
1
+ {"version":3,"sources":["../src/core/http-client.ts","../src/core/auth-service.ts","../src/node/auth-client.ts","../src/nextjs/server-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.axiosInstance = axios.create({\r\n baseURL: baseUrl.replace(/\\/$/, ''),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n (config) => {\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '')) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n \r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n \r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // Initialize CSRF token if enabled\r\n if (this.config.csrfEnabled && typeof window !== 'undefined') {\r\n this.refreshCsrfToken();\r\n }\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/user', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/avatar', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/session');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/session/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/session/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // For Node.js server-side usage, set frontend base URL from environment\r\n const frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n \r\n if (frontendBaseUrl) {\r\n this['httpClient'].setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n \r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', data);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}","import { AuthClient } from '../node/auth-client';\r\nimport { AuthConfig, User, RegisterData } from '../types';\r\n\r\n// Server-side authentication utility for Next.js\r\nexport class NextServerAuth extends AuthClient {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Parse token from request headers\r\n public static parseTokenFromHeaders(headers: Headers): string | null {\r\n const authHeader = headers.get('authorization');\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n return null;\r\n }\r\n return authHeader.substring(7); // Remove 'Bearer ' prefix\r\n }\r\n\r\n // Parse token from cookies\r\n public static parseTokenFromCookies(cookies: string): string | null {\r\n const cookieArray = cookies.split(';');\r\n for (const cookie of cookieArray) {\r\n const [name, value] = cookie.trim().split('=');\r\n if (name === 'auth_token') {\r\n return decodeURIComponent(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Parse token from Next.js request object\r\n public static parseTokenFromRequest(req: any): string | null {\r\n // Try to get token from headers first\r\n if (req.headers) {\r\n const authHeader = req.headers.authorization || req.headers.Authorization;\r\n if (authHeader && authHeader.startsWith('Bearer ')) {\r\n return authHeader.substring(7);\r\n }\r\n }\r\n\r\n // Try to get token from cookies\r\n if (req.cookies) {\r\n return req.cookies.auth_token || null;\r\n }\r\n\r\n // Try to get token from cookie header\r\n if (req.headers && req.headers.cookie) {\r\n return this.parseTokenFromCookies(req.headers.cookie);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Verify token and get user\r\n public async verifyToken(token: string): Promise<User | null> {\r\n try {\r\n // Set the token for this request\r\n (this as any)['httpClient'].setAuthToken(token);\r\n \r\n // Get user profile to verify token\r\n const user = await this.getProfile();\r\n return user;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Create authenticated client with token\r\n public static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth {\r\n const client = new NextServerAuth(config);\r\n (client as any)['httpClient'].setAuthToken(token);\r\n (client as any)['token'] = token;\r\n return client;\r\n }\r\n}"]}