From ecba13594bf56d2a2eee47922d45d0542557c240 Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Sun, 27 Apr 2025 16:39:55 +0200 Subject: [PATCH] Add tokenService --- src/services/token.ts | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/services/token.ts diff --git a/src/services/token.ts b/src/services/token.ts new file mode 100644 index 0000000..d7e7333 --- /dev/null +++ b/src/services/token.ts @@ -0,0 +1,91 @@ +import { TokenData } from '../models/process.model'; + +export default class TokenService { + private static instance: TokenService; + public tokens: Map = new Map(); + private readonly STORAGE_KEY = 'ihm_tokens'; + + private constructor() { + this.loadTokensFromStorage(); + // Nettoyer les tokens expirés toutes les minutes + setInterval(() => this.cleanExpiredTokens(), 60 * 1000); + } + + static async getInstance(): Promise { + if (!TokenService.instance) { + TokenService.instance = new TokenService(); + } + return TokenService.instance; + } + + private loadTokensFromStorage(): void { + const storedTokens = localStorage.getItem(this.STORAGE_KEY); + if (storedTokens) { + const tokenArray = JSON.parse(storedTokens); + this.tokens = new Map(tokenArray); + console.log('Tokens loaded from storage:', this.tokens); + } + } + + private saveTokensToStorage(): void { + const tokenArray = Array.from(this.tokens.entries()); + localStorage.setItem(this.STORAGE_KEY, JSON.stringify(tokenArray)); + } + + generateSessionToken(origin: string): string { + const token = crypto.randomUUID(); + const expiration = Date.now() + (30 * 60 * 1000); // 30 minutes + + this.tokens.set(token, { + token, + origin, + expiration, + createdAt: Date.now() + }); + + this.saveTokensToStorage(); + console.log('Token generated:', token); + console.log('Tokens map:', this.tokens); + + return token; + } + + validateToken(token: string, origin: string): boolean { + this.loadTokensFromStorage(); // Recharger les tokens avant validation + const tokenData = this.tokens.get(token); + + console.log('Validating token:', token); + console.log('Current tokens:', this.tokens); + console.log('Token data found:', tokenData); + + if (!tokenData) return false; + if (tokenData.origin !== origin) return false; + if (tokenData.expiration < Date.now()) { + console.log(`Token expired: ${token}`); + return false; + } + + return true; + } + + removeToken(token: string): void { + this.tokens.delete(token); + this.saveTokensToStorage(); + } + + cleanExpiredTokens(): void { + const now = Date.now(); + let hasExpired = false; + + for (const [token, data] of this.tokens.entries()) { + if (data.expiration < now) { + this.tokens.delete(token); + hasExpired = true; + } + } + + if (hasExpired) { + this.saveTokensToStorage(); + } + } +} \ No newline at end of file