| | import apiClient from './apiClient'; |
| | import cacheService from './cacheService'; |
| | import cookieService from './cookieService'; |
| |
|
| | |
| | |
| | |
| | class SecurityService { |
| | |
| | |
| | |
| | |
| | generateDeviceFingerprint() { |
| | const userAgent = navigator.userAgent; |
| | const screenResolution = `${screen.width}x${screen.height}`; |
| | const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; |
| | const language = navigator.language; |
| | |
| | |
| | const fingerprint = `${userAgent}-${screenResolution}-${timezone}-${language}`; |
| | return btoa(fingerprint).replace(/[^a-zA-Z0-9]/g, '').substring(0, 32); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | validateDeviceFingerprint(storedFingerprint) { |
| | const currentFingerprint = this.generateDeviceFingerprint(); |
| | return storedFingerprint === currentFingerprint; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | async storeAuthData(authData, rememberMe = false) { |
| | |
| | await cacheService.setAuthCache(authData, rememberMe); |
| | |
| | |
| | await cookieService.setAuthTokens(authData.token, rememberMe); |
| | |
| | |
| | localStorage.setItem('token', authData.token); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | async clearAuthData() { |
| | |
| | await cacheService.clearAuthCache(); |
| | |
| | |
| | await cookieService.clearAuthTokens(); |
| | |
| | |
| | localStorage.removeItem('token'); |
| | localStorage.removeItem('rememberMePreference'); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | async getAuthData() { |
| | |
| | const cachedAuth = await cacheService.getAuthCache(); |
| | if (cachedAuth) { |
| | return cachedAuth; |
| | } |
| | |
| | |
| | const cookieAuth = await cookieService.getAuthTokens(); |
| | if (cookieAuth) { |
| | return { |
| | token: cookieAuth.accessToken, |
| | user: null, |
| | rememberMe: cookieAuth.rememberMe |
| | }; |
| | } |
| | |
| | |
| | const token = localStorage.getItem('token'); |
| | if (token) { |
| | return { |
| | token, |
| | user: null, |
| | rememberMe: localStorage.getItem('rememberMePreference') === 'true' |
| | }; |
| | } |
| | |
| | return null; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | async refreshAuthTokens(newToken, rememberMe = false) { |
| | |
| | await this.clearAuthData(); |
| | |
| | |
| | await this.storeAuthData({ token: newToken }, rememberMe); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | async secureRequest(method, url, data = null) { |
| | try { |
| | const config = { method, url }; |
| | |
| | if (data) { |
| | config.data = data; |
| | } |
| | |
| | const response = await apiClient(config); |
| | return response.data; |
| | } catch (error) { |
| | console.error(`SecurityService error in ${method} ${url}:`, error); |
| | throw error; |
| | } |
| | } |
| | } |
| |
|
| | |
| | export default new SecurityService(); |