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