-- ============================================================================ -- 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 -- ============================================================================