fix: SQL urgente para corrigir erro 401 no login - RLS permissivo temporário
This commit is contained in:
66
EXECUTAR_AGORA.md
Normal file
66
EXECUTAR_AGORA.md
Normal file
@@ -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
|
||||||
|
|
||||||
183
fix_rls_401_urgente.sql
Normal file
183
fix_rls_401_urgente.sql
Normal file
@@ -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
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
Reference in New Issue
Block a user