Files
Erik Silva 2f1cf2bb2a v1.4: Segurança multi-tenant, file serving via API e UX humanizada
-  Validação cross-tenant no login e rotas protegidas
-  File serving via /api/files/{bucket}/{path} (eliminação DNS)
-  Mensagens de erro humanizadas inline (sem pop-ups)
-  Middleware tenant detection via headers customizados
-  Upload de logos retorna URLs via API
-  README atualizado com changelog v1.4 completo
2025-12-13 15:05:51 -03:00

81 lines
1.7 KiB
TypeScript

/**
* Auth utilities - Gerenciamento de autenticação no cliente
*/
export interface User {
id: string;
email: string;
name: string;
role: string;
tenantId?: string;
company?: string;
subdomain?: string;
logoUrl?: string;
}
const TOKEN_KEY = 'token';
const USER_KEY = 'user';
/**
* Salva token e dados do usuário no localStorage
*/
export function saveAuth(token: string, user: User): void {
if (typeof window === 'undefined') return;
localStorage.setItem(TOKEN_KEY, token);
localStorage.setItem(USER_KEY, JSON.stringify(user));
}
/**
* Retorna o token JWT armazenado
*/
export function getToken(): string | null {
if (typeof window === 'undefined') return null;
return localStorage.getItem(TOKEN_KEY);
}
/**
* Retorna os dados do usuário armazenados
*/
export function getUser(): User | null {
if (typeof window === 'undefined') return null;
const userStr = localStorage.getItem(USER_KEY);
if (!userStr) return null;
try {
return JSON.parse(userStr);
} catch {
return null;
}
}
/**
* Verifica se o usuário está autenticado
*/
export function isAuthenticated(): boolean {
return !!getToken() && !!getUser();
}
/**
* Remove token e dados do usuário (logout)
*/
export function clearAuth(): void {
if (typeof window === 'undefined') return;
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_KEY);
}
/**
* Retorna headers com Authorization para requisições autenticadas
*/
export function getAuthHeaders(): HeadersInit {
const token = getToken();
return {
'Content-Type': 'application/json',
...(token ? { 'Authorization': `Bearer ${token}` } : {}),
};
}