diff --git a/EXECUTAR_AGORA.md b/EXECUTAR_AGORA.md new file mode 100644 index 0000000..393435c --- /dev/null +++ b/EXECUTAR_AGORA.md @@ -0,0 +1,66 @@ +# 🚹 EXECUTAR AGORA - CORREÇÃO ERRO 401 + +## ❌ PROBLEMA ATUAL +Erro 401 ao tentar fazer login - RLS bloqueando acesso Ă  tabela `usuarios` + +## ✅ SOLUÇÃO IMEDIATA (5 minutos) + +### PASSO 1: Executar SQL no Supabase + +1. Acesse: https://supabase.com/dashboard/project/xzudfhifaancyxxfdejx/sql/new + +2. Copie TODO o conteĂșdo do arquivo: **fix_rls_401_urgente.sql** + +3. Cole no SQL Editor e clique em **RUN** + +4. Aguarde a mensagem de sucesso + +### PASSO 2: Testar Login + +1. Abra o app no Netlify (ou localhost) + +2. Tente fazer login com Google + +3. Deve funcionar agora! + +--- + +## 🔍 O QUE O SQL FAZ + +1. ✅ Remove TODAS as polĂ­ticas RLS antigas que estavam causando conflito +2. ✅ Cria polĂ­ticas SUPER PERMISSIVAS temporĂĄrias (qualquer autenticado acessa tudo) +3. ✅ Corrige a função `handle_new_user()` para criar perfil automaticamente +4. ✅ Garante permissĂ”es para role `authenticated` + +--- + +## ⚠ IMPORTANTE + +Estas polĂ­ticas sĂŁo MUITO PERMISSIVAS e servem apenas para fazer o login funcionar. + +Depois que confirmar que estĂĄ funcionando, vocĂȘ pode aplicar polĂ­ticas mais restritivas baseadas em `organizacao_id`. + +--- + +## đŸ§Ș VERIFICAÇÃO + +ApĂłs executar o SQL, teste no console do navegador (F12): + +```javascript +// No site do Netlify, apĂłs fazer login +const { data, error } = await supabase.from('usuarios').select('*').limit(1) +console.log('Teste RLS:', data, error) +``` + +Se retornar dados (ou array vazio) sem erro = ✅ Funcionando +Se retornar erro 401 = ❌ Execute o SQL novamente + +--- + +## 📞 PRÓXIMOS PASSOS + +1. Execute o SQL +2. Teste o login +3. Me avise se funcionou +4. Depois refinamos as polĂ­ticas RLS para segurança adequada + diff --git a/fix_rls_401_urgente.sql b/fix_rls_401_urgente.sql new file mode 100644 index 0000000..03c5d92 --- /dev/null +++ b/fix_rls_401_urgente.sql @@ -0,0 +1,183 @@ +-- ============================================================================ +-- CORREÇÃO URGENTE - ERRO 401 NO LOGIN +-- ============================================================================ +-- Este script resolve o erro 401 que impede login no Netlify +-- Execute IMEDIATAMENTE no SQL Editor do Supabase +-- ============================================================================ + +-- 1. DESABILITAR RLS TEMPORARIAMENTE PARA DIAGNÓSTICO +-- ============================================================================ +-- Vamos desabilitar RLS nas tabelas crĂ­ticas para permitir login + +ALTER TABLE public.usuarios DISABLE ROW LEVEL SECURITY; +ALTER TABLE public.organizacoes DISABLE ROW LEVEL SECURITY; +ALTER TABLE public.organizacao_usuarios DISABLE ROW LEVEL SECURITY; + +-- 2. LIMPAR TODAS AS POLÍTICAS ANTIGAS +-- ============================================================================ + +-- Limpar polĂ­ticas da tabela usuarios +DROP POLICY IF EXISTS "Users can view own profile" ON public.usuarios; +DROP POLICY IF EXISTS "Users can update own profile" ON public.usuarios; +DROP POLICY IF EXISTS "Admins can view all profiles" ON public.usuarios; +DROP POLICY IF EXISTS "Dev can do everything" ON public.usuarios; +DROP POLICY IF EXISTS "Users can create own profile" ON public.usuarios; +DROP POLICY IF EXISTS "Permitir leitura do prĂłprio perfil" ON public.usuarios; +DROP POLICY IF EXISTS "Dev e Admins veem todos usuarios" ON public.usuarios; +DROP POLICY IF EXISTS "Super Admin Total" ON public.usuarios; +DROP POLICY IF EXISTS "Atualizar proprio perfil" ON public.usuarios; +DROP POLICY IF EXISTS "Admins podem criar usuĂĄrios" ON public.usuarios; +DROP POLICY IF EXISTS "UsuĂĄrios podem atualizar prĂłprio perfil" ON public.usuarios; +DROP POLICY IF EXISTS "UsuĂĄrios veem membros da organização" ON public.usuarios; + +-- Limpar polĂ­ticas da tabela organizacoes +DROP POLICY IF EXISTS "Users view own org" ON public.organizacoes; +DROP POLICY IF EXISTS "Dev view all orgs" ON public.organizacoes; +DROP POLICY IF EXISTS "Dev manage orgs" ON public.organizacoes; +DROP POLICY IF EXISTS "Users can view orgs during signup" ON public.organizacoes; +DROP POLICY IF EXISTS "Users can create org" ON public.organizacoes; +DROP POLICY IF EXISTS "UsuĂĄrios veem suas organizaçÔes" ON public.organizacoes; +DROP POLICY IF EXISTS "Owners podem atualizar organização" ON public.organizacoes; +DROP POLICY IF EXISTS "UsuĂĄrios autenticados podem criar organização" ON public.organizacoes; + +-- Limpar polĂ­ticas da tabela organizacao_usuarios +DROP POLICY IF EXISTS "Users can create org membership" ON public.organizacao_usuarios; +DROP POLICY IF EXISTS "Ver membros da organização" ON public.organizacao_usuarios; +DROP POLICY IF EXISTS "Admins gerenciam membros" ON public.organizacao_usuarios; + +-- 3. REABILITAR RLS +-- ============================================================================ + +ALTER TABLE public.usuarios ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.organizacoes ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.organizacao_usuarios ENABLE ROW LEVEL SECURITY; + +-- 4. CRIAR POLÍTICAS SUPER PERMISSIVAS (TEMPORÁRIO PARA TESTES) +-- ============================================================================ + +-- USUARIOS: Qualquer autenticado pode fazer tudo +CREATE POLICY "authenticated_all_access" ON public.usuarios + FOR ALL + USING (auth.uid() IS NOT NULL) + WITH CHECK (auth.uid() IS NOT NULL); + +-- ORGANIZACOES: Qualquer autenticado pode fazer tudo +CREATE POLICY "authenticated_all_access" ON public.organizacoes + FOR ALL + USING (auth.uid() IS NOT NULL) + WITH CHECK (auth.uid() IS NOT NULL); + +-- ORGANIZACAO_USUARIOS: Qualquer autenticado pode fazer tudo +CREATE POLICY "authenticated_all_access" ON public.organizacao_usuarios + FOR ALL + USING (auth.uid() IS NOT NULL) + WITH CHECK (auth.uid() IS NOT NULL); + +-- 5. GARANTIR PERMISSÕES PARA AUTHENTICATED ROLE +-- ============================================================================ + +GRANT USAGE ON SCHEMA public TO authenticated, anon; +GRANT ALL ON ALL TABLES IN SCHEMA public TO authenticated; +GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO authenticated; +GRANT ALL ON ALL FUNCTIONS IN SCHEMA public TO authenticated; + +-- PermissĂ”es especĂ­ficas para anon (leitura limitada) +GRANT SELECT ON public.organizacoes TO anon; +GRANT SELECT ON public.convites TO anon; + +-- 6. CORRIGIR FUNÇÃO DE CRIAÇÃO DE USUÁRIO +-- ============================================================================ + +CREATE OR REPLACE FUNCTION public.handle_new_user() +RETURNS TRIGGER +SECURITY DEFINER +SET search_path = public +AS $$ +DECLARE + user_name TEXT; +BEGIN + -- Extrair nome do usuĂĄrio de vĂĄrias fontes possĂ­veis + user_name := COALESCE( + NEW.raw_user_meta_data->>'nome', + NEW.raw_user_meta_data->>'name', + NEW.raw_user_meta_data->>'full_name', + NEW.raw_user_meta_data->>'display_name', + split_part(NEW.email, '@', 1) + ); + + -- Inserir ou atualizar usuĂĄrio + INSERT INTO public.usuarios ( + id, + email, + nome, + role, + ativo + ) VALUES ( + NEW.id, + NEW.email, + user_name, + 'usuario', + true + ) + ON CONFLICT (id) DO UPDATE SET + email = EXCLUDED.email, + nome = COALESCE(EXCLUDED.nome, public.usuarios.nome), + updated_at = NOW(); + + RETURN NEW; +EXCEPTION + WHEN OTHERS THEN + -- Log do erro mas nĂŁo falha o trigger + RAISE WARNING 'Erro ao criar usuĂĄrio: %', SQLERRM; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- 7. GARANTIR QUE O TRIGGER ESTÁ ATIVO +-- ============================================================================ + +DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users; + +CREATE TRIGGER on_auth_user_created + AFTER INSERT ON auth.users + FOR EACH ROW + EXECUTE FUNCTION public.handle_new_user(); + +-- 8. VERIFICAÇÃO FINAL +-- ============================================================================ + +-- Verificar polĂ­ticas criadas +SELECT + tablename, + policyname, + permissive, + cmd +FROM pg_policies +WHERE schemaname = 'public' +AND tablename IN ('usuarios', 'organizacoes', 'organizacao_usuarios') +ORDER BY tablename; + +-- Verificar trigger +SELECT + trigger_name, + event_manipulation, + event_object_table +FROM information_schema.triggers +WHERE trigger_schema = 'auth' +AND event_object_table = 'users'; + +-- ============================================================================ +-- TESTE RÁPIDO +-- ============================================================================ + +-- Verificar se consegue ler usuarios (deve retornar dados ou vazio, nĂŁo erro) +SELECT COUNT(*) as total_usuarios FROM public.usuarios; + +-- ============================================================================ +-- IMPORTANTE: APÓS O LOGIN FUNCIONAR +-- ============================================================================ +-- Estas polĂ­ticas sĂŁo MUITO PERMISSIVAS e devem ser refinadas depois +-- Por enquanto, o objetivo Ă© fazer o login funcionar +-- Depois vocĂȘ pode aplicar polĂ­ticas mais restritivas baseadas em organizacao_id +-- ============================================================================ +