feat: enhance login functionality by adding IP geolocation tracking and advanced filtering options in the audit page, improving user insights and data accuracy

This commit is contained in:
2025-11-30 08:12:46 -03:00
parent e35846103e
commit 334676b860
4 changed files with 610 additions and 38 deletions

View File

@@ -4,7 +4,7 @@
import logo from '$lib/assets/logo_governo_PE.png';
import type { Snippet } from 'svelte';
import { loginModalStore } from '$lib/stores/loginModal.svelte';
import { useQuery } from 'convex-svelte';
import { useQuery, useConvexClient } from 'convex-svelte';
import { api } from '@sgse-app/backend/convex/_generated/api';
import NotificationBell from '$lib/components/chat/NotificationBell.svelte';
import ChatWidget from '$lib/components/chat/ChatWidget.svelte';
@@ -14,11 +14,26 @@
import { authClient } from '$lib/auth';
import { resolve } from '$app/paths';
// Função para obter IP público (similar ao sistema de ponto)
async function obterIPPublico(): Promise<string | undefined> {
try {
const response = await fetch('https://api.ipify.org?format=json');
if (response.ok) {
const data = (await response.json()) as { ip: string };
return data.ip;
}
} catch (error) {
console.warn('Erro ao obter IP público:', error);
}
return undefined;
}
let { children }: { children: Snippet } = $props();
const currentPath = $derived(page.url.pathname);
const currentUser = useQuery(api.auth.getCurrentUser, {});
const convexClient = useConvexClient();
// Função para obter a URL do avatar/foto do usuário
const avatarUrlDoUsuario = $derived(() => {
@@ -122,18 +137,67 @@
erroLogin = '';
carregandoLogin = true;
// const browserInfo = await getBrowserInfo();
// Obter IP público e userAgent antes do login
const [ipPublico, userAgent] = await Promise.all([
obterIPPublico().catch(() => undefined),
Promise.resolve(typeof navigator !== 'undefined' ? navigator.userAgent : undefined)
]);
const result = await authClient.signIn.email(
{ email: matricula.trim(), password: senha },
{
onError: (ctx) => {
onError: async (ctx) => {
// Registrar tentativa de login falha
try {
await convexClient.mutation(api.logsLogin.registrarTentativaLogin, {
matriculaOuEmail: matricula.trim(),
sucesso: false,
motivoFalha: ctx.error?.message || 'Erro desconhecido',
userAgent: userAgent,
ipAddress: ipPublico,
});
} catch (err) {
console.error('Erro ao registrar tentativa de login falha:', err);
}
alert(ctx.error.message);
}
}
);
if (result.data) {
// Registrar tentativa de login bem-sucedida
// Fazer de forma assíncrona para não bloquear o login
(async () => {
try {
// Aguardar um pouco para o usuário ser sincronizado no Convex
await new Promise((resolve) => setTimeout(resolve, 500));
// Buscar o usuário no Convex usando getCurrentUser
const usuario = await convexClient.query(api.auth.getCurrentUser, {});
if (usuario && usuario._id) {
await convexClient.mutation(api.logsLogin.registrarTentativaLogin, {
usuarioId: usuario._id,
matriculaOuEmail: matricula.trim(),
sucesso: true,
userAgent: userAgent,
ipAddress: ipPublico,
});
} else {
// Se não encontrou o usuário, registrar sem usuarioId (será atualizado depois)
await convexClient.mutation(api.logsLogin.registrarTentativaLogin, {
matriculaOuEmail: matricula.trim(),
sucesso: true,
userAgent: userAgent,
ipAddress: ipPublico,
});
}
} catch (err) {
console.error('Erro ao registrar tentativa de login:', err);
// Não bloquear o login se houver erro ao registrar
}
})();
closeLoginModal();
goto(resolve('/'));
} else {