Fix: Supabase row-level security error
The AI addressed the Supabase row-level security error by ensuring correct authentication and data insertion in `TransactionForm.tsx`. It also updated `src/services/transacaoService.ts` to check for valid sessions.
This commit is contained in:
parent
c5d3e51a34
commit
9116d7a5be
@ -1,4 +1,3 @@
|
||||
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { Toaster } from "@/components/ui/toaster";
|
||||
import { Toaster as Sonner } from "@/components/ui/sonner";
|
||||
@ -105,7 +104,7 @@ const App = () => {
|
||||
setIsAutenticado(true);
|
||||
localStorage.setItem('autenticado', 'true');
|
||||
localStorage.setItem('userId', session.user.id);
|
||||
} else if (event === 'SIGNED_OUT' || event === 'USER_DELETED') {
|
||||
} else if (event === 'SIGNED_OUT') {
|
||||
setIsAutenticado(false);
|
||||
localStorage.setItem('autenticado', 'false');
|
||||
localStorage.removeItem('userId');
|
||||
|
||||
@ -20,16 +20,14 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
||||
setIsLoading(true);
|
||||
|
||||
try {
|
||||
// Verificar se temos um userId armazenado
|
||||
const userId = localStorage.getItem('userId');
|
||||
|
||||
// Verificar se temos uma sessão válida com o Supabase
|
||||
// Verificar se temos uma sessão válida com o Supabase primeiro
|
||||
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
||||
|
||||
if (sessionError) {
|
||||
console.error('Erro ao verificar sessão:', sessionError);
|
||||
setIsAutenticado(false);
|
||||
localStorage.setItem('autenticado', 'false');
|
||||
localStorage.removeItem('userId');
|
||||
|
||||
toast({
|
||||
title: "Erro de autenticação",
|
||||
@ -51,14 +49,13 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
||||
console.log('Não foi possível atualizar a sessão ou usuário não está autenticado');
|
||||
setIsAutenticado(false);
|
||||
localStorage.setItem('autenticado', 'false');
|
||||
localStorage.removeItem('userId');
|
||||
|
||||
if (userId) {
|
||||
toast({
|
||||
title: "Sessão expirada",
|
||||
description: "Sua sessão expirou. Por favor, faça login novamente",
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
toast({
|
||||
title: "Sessão expirada",
|
||||
description: "Sua sessão expirou. Por favor, faça login novamente",
|
||||
variant: "destructive"
|
||||
});
|
||||
|
||||
setIsLoading(false);
|
||||
return;
|
||||
@ -67,6 +64,10 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
||||
console.log('Sessão atualizada com sucesso');
|
||||
setIsAutenticado(true);
|
||||
localStorage.setItem('autenticado', 'true');
|
||||
|
||||
// Garantir que o userId esteja atualizado
|
||||
localStorage.setItem('userId', refreshData.session.user.id);
|
||||
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
@ -74,15 +75,12 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
||||
// Se chegou aqui, temos uma sessão válida
|
||||
setIsAutenticado(true);
|
||||
localStorage.setItem('autenticado', 'true');
|
||||
|
||||
// Se não tivermos um userId, vamos usar o da sessão
|
||||
if (!userId && sessionData.session.user.id) {
|
||||
localStorage.setItem('userId', sessionData.session.user.id);
|
||||
}
|
||||
localStorage.setItem('userId', sessionData.session.user.id);
|
||||
} catch (error) {
|
||||
console.error('Erro ao verificar autenticação:', error);
|
||||
setIsAutenticado(false);
|
||||
localStorage.setItem('autenticado', 'false');
|
||||
localStorage.removeItem('userId');
|
||||
|
||||
toast({
|
||||
title: "Erro inesperado",
|
||||
@ -112,6 +110,7 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
||||
} else if (event === 'TOKEN_REFRESHED' && session) {
|
||||
setIsAutenticado(true);
|
||||
localStorage.setItem('autenticado', 'true');
|
||||
localStorage.setItem('userId', session.user.id);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -57,59 +57,39 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
||||
}
|
||||
});
|
||||
|
||||
async function revalidateSession() {
|
||||
try {
|
||||
// Verificar sessão com Supabase
|
||||
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
||||
|
||||
if (sessionError || !sessionData.session) {
|
||||
console.error('Sessão inválida, tentando atualizar...');
|
||||
|
||||
// Tentar atualizar a sessão
|
||||
const { data: refreshData, error: refreshError } = await supabase.auth.refreshSession();
|
||||
|
||||
if (refreshError || !refreshData.session) {
|
||||
// Se não conseguir atualizar, redirecionar para login
|
||||
console.error('Não foi possível atualizar a sessão:', refreshError);
|
||||
toast({
|
||||
title: "Sessão expirada",
|
||||
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
||||
variant: "destructive"
|
||||
});
|
||||
|
||||
// Limpar o estado de autenticação
|
||||
localStorage.setItem('autenticado', 'false');
|
||||
|
||||
// Redirecionar para a página de login após um pequeno atraso
|
||||
setTimeout(() => {
|
||||
navigate('/auth');
|
||||
}, 1000);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
console.log('Sessão atualizada com sucesso');
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Erro ao verificar sessão:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function onSubmit(data: TransactionFormValues) {
|
||||
setIsSubmitting(true);
|
||||
|
||||
try {
|
||||
// Verificar se a sessão está válida
|
||||
const sessionValid = await revalidateSession();
|
||||
if (!sessionValid) {
|
||||
setIsSubmitting(false);
|
||||
// Obter a sessão atual primeiro
|
||||
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
||||
|
||||
if (sessionError) {
|
||||
toast({
|
||||
title: "Erro de autenticação",
|
||||
description: "Ocorreu um problema ao verificar sua autenticação. Por favor, faça login novamente.",
|
||||
variant: "destructive"
|
||||
});
|
||||
navigate('/auth');
|
||||
return;
|
||||
}
|
||||
|
||||
// Verificar se temos uma sessão válida
|
||||
if (!sessionData.session) {
|
||||
toast({
|
||||
title: "Sessão expirada",
|
||||
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
||||
variant: "destructive"
|
||||
});
|
||||
navigate('/auth');
|
||||
return;
|
||||
}
|
||||
|
||||
const userId = sessionData.session.user.id;
|
||||
|
||||
// Atualizar o userId no localStorage para garantir consistência
|
||||
localStorage.setItem('userId', userId);
|
||||
|
||||
const valorNumerico = parseFloat(data.valor.replace(',', '.'));
|
||||
|
||||
if (isNaN(valorNumerico)) {
|
||||
@ -118,19 +98,6 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
||||
description: "O valor precisa ser um número válido",
|
||||
variant: "destructive"
|
||||
});
|
||||
setIsSubmitting(false);
|
||||
return;
|
||||
}
|
||||
|
||||
// Obtém o ID do usuário logado
|
||||
const userId = localStorage.getItem('userId');
|
||||
if (!userId) {
|
||||
toast({
|
||||
title: "Erro de autenticação",
|
||||
description: "Você precisa estar logado para adicionar transações",
|
||||
variant: "destructive"
|
||||
});
|
||||
setIsSubmitting(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -144,15 +111,12 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
||||
|
||||
console.log(`Inserindo transação na tabela ${tabelaTransacoes} para o usuário ${userId}`);
|
||||
|
||||
// Obtém a sessão atual para acessar o token JWT - nova solicitação após validação
|
||||
const { data: sessionData } = await supabase.auth.getSession();
|
||||
|
||||
// Insere a transação na tabela específica do usuário
|
||||
// Insere a transação na tabela específica do usuário usando o userId da sessão atual
|
||||
const { error } = await supabase
|
||||
.from(tabelaTransacoes as any)
|
||||
.insert([
|
||||
{
|
||||
usuario_id: userId,
|
||||
usuario_id: userId, // Usar o userId da sessão atual, não do localStorage
|
||||
estabelecimento: data.estabelecimento,
|
||||
valor: valorFinal,
|
||||
detalhes: data.detalhes,
|
||||
@ -165,7 +129,7 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
||||
if (error) {
|
||||
console.error('Erro ao salvar transação:', error);
|
||||
|
||||
if (error.message.includes('JWTClaimsSetVerificationException')) {
|
||||
if (error.message.includes('authentication')) {
|
||||
toast({
|
||||
title: "Erro de autenticação",
|
||||
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user