| 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(); |