revokeConsent()¶
Revoga o consentimento do usuário, bloqueando todos os scripts de rastreamento e garantindo conformidade com o direito de exclusão da LGPD (Art. 18, VI).
📋 Visão Geral¶
O método revokeConsent() permite que usuários exerçam seu direito de revogar consentimento e solicitar a exclusão de dados pessoais, conforme garantido pela LGPD Art. 18, inciso VI.
Características: - ✅ Bloqueio Imediato: Scripts de rastreamento bloqueados instantaneamente - ✅ Limpeza de Dados: Remove localStorage, cookies de rastreamento - ✅ Auditoria LGPD: Registra motivo da revogação para conformidade - ✅ Síncrono: Execução imediata sem Promise - ✅ Irreversível: Usuário precisa aceitar consentimento novamente
Efeitos: - 🚫 Google Tag Manager bloqueado - 🚫 Facebook Pixel bloqueado - 🗑️ localStorage.complyr_consent limpo - 🗑️ Cookies de rastreamento removidos - 📝 Evento de auditoria registrado no backend
🎯 Casos de Uso¶
Quando Usar¶
- Botão "Excluir Meus Dados": Área de privacidade do usuário
- Solicitação DSAR: Data Subject Access Request (LGPD Art. 18)
- Cancelamento de Conta: Usuário deleta conta
- Logout com Exclusão: Sair e remover dados
- Teste de Conformidade: Verificar bloqueio de scripts
- Reset de Consentimento: Limpar estado para novo teste
Quando NÃO Usar¶
- ❌ Para logout simples (use apenas logout do sistema)
- ❌ Para alternar preferências (use
openPreferences()) - ❌ Para desativar um script específico (use preferências granulares)
📚 Assinatura do Método¶
TypeScript¶
interface ComplyrAPI {
/**
* Revoga o consentimento do usuário
* @param reason - Motivo da revogação (opcional, para auditoria LGPD)
* @remarks
* - Limpa localStorage de consentimento
* - Bloqueia scripts de rastreamento (GTM, Facebook Pixel)
* - Remove cookies de terceiros
* - Registra evento no backend para conformidade LGPD Art. 18, VI
*/
revokeConsent(reason?: string): void;
}
JavaScript¶
🔧 Parâmetros¶
reason (string, opcional)¶
Motivo da revogação para fins de auditoria e conformidade com LGPD.
Boas Práticas: - Sempre fornecer um motivo claro - Incluir artigo da LGPD quando aplicável - Usar linguagem objetiva e profissional
Exemplos de Motivos:
// ✅ BOM: Específico e referencia LGPD
window.complyr.revokeConsent('Usuário solicitou exclusão de dados - LGPD Art. 18, VI');
// ✅ BOM: Contexto de cancelamento de conta
window.complyr.revokeConsent('Cancelamento de conta a pedido do usuário');
// ✅ BOM: DSAR (Data Subject Access Request)
window.complyr.revokeConsent('Solicitação formal de exclusão via DSAR - Ticket #12345');
// ✅ BOM: Logout com limpeza
window.complyr.revokeConsent('Logout do usuário com opção de limpeza de dados');
// ⚠️ ACEITÁVEL: Sem motivo (permitido, mas não recomendado)
window.complyr.revokeConsent();
// ❌ RUIM: Motivo vago
window.complyr.revokeConsent('usuário pediu');
↩️ Valor de Retorno¶
Tipo: void (síncrono)
O método não retorna nenhum valor. A revogação é processada imediatamente.
💡 Exemplos de Uso¶
Exemplo 1: Botão "Excluir Meus Dados"¶
<!-- Página de configurações de privacidade -->
<div class="privacy-settings">
<h2>Privacidade e Dados</h2>
<div class="danger-zone">
<h3>Zona de Perigo</h3>
<p>Ações irreversíveis relacionadas aos seus dados.</p>
<button id="delete-data-btn" class="btn-danger">
🗑️ Excluir Meus Dados
</button>
</div>
</div>
<script>
document.getElementById('delete-data-btn').addEventListener('click', function() {
// Confirmação dupla para ação crítica
const confirmed = confirm(
'Tem certeza que deseja excluir todos os seus dados?\n\n' +
'Esta ação irá:\n' +
'• Revogar todos os consentimentos\n' +
'• Bloquear rastreamento futuro\n' +
'• Limpar dados locais\n\n' +
'Esta ação é IRREVERSÍVEL.'
);
if (!confirmed) {
return;
}
// Segunda confirmação
const doubleConfirmed = confirm(
'ATENÇÃO: Esta é sua última chance!\n\n' +
'Confirma a exclusão de todos os seus dados?'
);
if (!doubleConfirmed) {
return;
}
try {
// Revogar consentimento via Complyr
if (window.complyr) {
window.complyr.revokeConsent(
'Usuário solicitou exclusão de dados pessoais - LGPD Art. 18, VI'
);
}
// Chamar API do backend para deletar dados do servidor
await fetch('/api/user/delete-account', {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${getAuthToken()}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
reason: 'User requested data deletion',
lgpd_article: 'Art. 18, VI'
})
});
// Fazer logout
logout();
// Redirecionar com mensagem
alert('Seus dados foram excluídos com sucesso.');
window.location.href = '/';
} catch (error) {
console.error('Erro ao excluir dados:', error);
alert('Erro ao processar solicitação. Entre em contato com o suporte.');
}
});
</script>
<style>
.danger-zone {
background-color: #fee;
border: 2px solid #fcc;
border-radius: 8px;
padding: 20px;
margin-top: 20px;
}
.btn-danger {
background-color: #d32f2f;
color: white;
padding: 12px 24px;
border: none;
border-radius: 4px;
cursor: pointer;
font-weight: bold;
}
.btn-danger:hover {
background-color: #b71c1c;
}
</style>
Exemplo 2: React - Configurações de Privacidade¶
// components/PrivacySettings.tsx
import React, { useState } from 'react';
import { useRouter } from 'next/navigation';
import { useAuth } from '@/contexts/auth-context';
export function PrivacySettings() {
const [isDeleting, setIsDeleting] = useState(false);
const { logout } = useAuth();
const router = useRouter();
const handleDeleteData = async () => {
// Confirmação
const confirmed = window.confirm(
'Tem certeza que deseja excluir todos os seus dados?\n\n' +
'Esta ação é irreversível e inclui:\n' +
'• Revogação de consentimentos\n' +
'• Bloqueio de rastreamento\n' +
'• Exclusão de dados pessoais\n' +
'• Encerramento da conta'
);
if (!confirmed) {
return;
}
setIsDeleting(true);
try {
// 1. Revogar consentimento
if (window.complyr) {
window.complyr.revokeConsent(
'Usuário solicitou exclusão de conta e dados - LGPD Art. 18, VI'
);
}
// 2. Chamar API de exclusão
const response = await fetch('/api/user/delete-account', {
method: 'DELETE',
});
if (!response.ok) {
throw new Error('Falha ao deletar conta');
}
// 3. Logout
await logout();
// 4. Redirecionar
alert('Sua conta e dados foram excluídos com sucesso.');
router.push('/');
} catch (error) {
console.error('Erro ao excluir dados:', error);
alert('Erro ao processar solicitação. Tente novamente ou entre em contato com o suporte.');
} finally {
setIsDeleting(false);
}
};
return (
<div className="privacy-settings">
<h2 className="text-2xl font-bold mb-4">Privacidade e Dados</h2>
<div className="danger-zone bg-red-50 border-2 border-red-200 rounded-lg p-6">
<h3 className="text-xl font-semibold text-red-900 mb-2">
Zona de Perigo
</h3>
<p className="text-red-700 mb-4">
Ações irreversíveis relacionadas aos seus dados pessoais.
</p>
<button
onClick={handleDeleteData}
disabled={isDeleting}
className="bg-red-600 hover:bg-red-700 disabled:bg-red-300 text-white font-bold py-3 px-6 rounded"
>
{isDeleting ? (
<>
<span className="inline-block animate-spin mr-2">⏳</span>
Excluindo...
</>
) : (
<>🗑️ Excluir Meus Dados</>
)}
</button>
</div>
</div>
);
}
Exemplo 3: Vue.js - Composable para DSAR¶
// composables/useDataDeletion.ts
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { useAuthStore } from '@/stores/auth';
export function useDataDeletion() {
const isDeleting = ref(false);
const error = ref<string | null>(null);
const router = useRouter();
const authStore = useAuthStore();
const deleteUserData = async (reason: string) => {
// Confirmação
const confirmed = window.confirm(
'Confirma a exclusão de todos os seus dados?\n\n' +
'Esta ação é IRREVERSÍVEL.'
);
if (!confirmed) {
return false;
}
isDeleting.value = true;
error.value = null;
try {
// 1. Revogar consentimento
if (window.complyr) {
window.complyr.revokeConsent(reason);
}
// 2. Deletar dados no backend
const response = await fetch('/api/user/delete-account', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ reason }),
});
if (!response.ok) {
throw new Error('Falha ao processar solicitação');
}
// 3. Logout
await authStore.logout();
// 4. Redirecionar
router.push('/');
return true;
} catch (err: any) {
error.value = err.message || 'Erro ao excluir dados';
return false;
} finally {
isDeleting.value = false;
}
};
return {
deleteUserData,
isDeleting,
error,
};
}
Uso:
<!-- pages/settings/privacy.vue -->
<template>
<div class="privacy-settings">
<h2>Privacidade e Dados</h2>
<div v-if="error" class="error-message">
{{ error }}
</div>
<button
@click="handleDelete"
:disabled="isDeleting"
class="btn-danger"
>
{{ isDeleting ? 'Excluindo...' : 'Excluir Meus Dados' }}
</button>
</div>
</template>
<script setup lang="ts">
import { useDataDeletion } from '@/composables/useDataDeletion';
const { deleteUserData, isDeleting, error } = useDataDeletion();
const handleDelete = async () => {
const success = await deleteUserData(
'Usuário solicitou exclusão via configurações - LGPD Art. 18, VI'
);
if (success) {
alert('Dados excluídos com sucesso.');
}
};
</script>
Exemplo 4: WordPress - Plugin de Exclusão de Dados¶
<?php
/**
* Plugin Name: Complyr Data Deletion
* Description: Permite usuários excluírem seus dados conforme LGPD
*/
// Adicionar página de configurações de privacidade
function complyr_privacy_settings_page() {
if (!is_user_logged_in()) {
wp_redirect(wp_login_url());
exit;
}
?>
<div class="wrap">
<h1>Privacidade e Dados</h1>
<div class="card" style="max-width: 600px;">
<h2>Excluir Meus Dados</h2>
<p>
De acordo com a LGPD (Lei Geral de Proteção de Dados), você tem o direito de
solicitar a exclusão dos seus dados pessoais.
</p>
<p><strong>Esta ação irá:</strong></p>
<ul>
<li>Revogar todos os consentimentos</li>
<li>Bloquear rastreamento futuro</li>
<li>Excluir sua conta e dados pessoais</li>
</ul>
<p style="color: #d32f2f;">
<strong>ATENÇÃO:</strong> Esta ação é irreversível.
</p>
<form method="post" id="delete-data-form">
<?php wp_nonce_field('complyr_delete_data', 'complyr_nonce'); ?>
<label>
<input type="checkbox" name="confirm" required>
Confirmo que desejo excluir permanentemente meus dados
</label>
<p>
<button type="submit" class="button button-primary button-large"
style="background-color: #d32f2f; border-color: #d32f2f;"
onclick="return confirm('Tem certeza ABSOLUTA que deseja excluir seus dados? Esta ação NÃO pode ser desfeita.');">
Excluir Meus Dados
</button>
</p>
</form>
</div>
</div>
<script>
document.getElementById('delete-data-form').addEventListener('submit', function() {
// Revogar consentimento via Complyr
if (window.complyr && typeof window.complyr.revokeConsent === 'function') {
window.complyr.revokeConsent(
'Usuário WordPress solicitou exclusão de dados - LGPD Art. 18, VI'
);
}
});
</script>
<?php
}
// Processar solicitação de exclusão
function complyr_process_data_deletion() {
if (!isset($_POST['complyr_nonce']) || !wp_verify_nonce($_POST['complyr_nonce'], 'complyr_delete_data')) {
return;
}
if (!isset($_POST['confirm'])) {
return;
}
$user_id = get_current_user_id();
if (!$user_id) {
return;
}
// Registrar auditoria
$log_entry = array(
'user_id' => $user_id,
'action' => 'data_deletion_request',
'reason' => 'Usuário WordPress solicitou exclusão - LGPD Art. 18, VI',
'timestamp' => current_time('mysql'),
'ip_address' => $_SERVER['REMOTE_ADDR']
);
add_option('complyr_deletion_log_' . $user_id, $log_entry);
// Fazer logout
wp_logout();
// Agendar exclusão de dados (diferido para evitar problemas)
wp_schedule_single_event(time() + 300, 'complyr_delete_user_data', array($user_id));
// Redirecionar com mensagem
wp_redirect(home_url('/?data-deleted=1'));
exit;
}
add_action('admin_post_delete_my_data', 'complyr_process_data_deletion');
// Hook para deletar dados de fato
function complyr_delete_user_data_callback($user_id) {
// Deletar posts do usuário
$posts = get_posts(array(
'author' => $user_id,
'post_type' => 'any',
'posts_per_page' => -1
));
foreach ($posts as $post) {
wp_delete_post($post->ID, true);
}
// Deletar comentários
$comments = get_comments(array('user_id' => $user_id));
foreach ($comments as $comment) {
wp_delete_comment($comment->comment_ID, true);
}
// Deletar usuário
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
add_action('complyr_delete_user_data', 'complyr_delete_user_data_callback');
Exemplo 5: Logout com Opção de Limpeza¶
// Página de logout com opção de limpar dados
function handleLogout() {
const clearData = confirm(
'Deseja também REVOGAR seus consentimentos e limpar dados de rastreamento?\n\n' +
'Recomendado se você está usando um computador público.'
);
if (clearData) {
// Revogar consentimento
if (window.complyr) {
window.complyr.revokeConsent(
'Logout do usuário com limpeza de dados de rastreamento'
);
}
}
// Fazer logout normal
api.logout().then(() => {
window.location.href = '/login';
});
}
// Botão de logout
document.getElementById('logout-btn').addEventListener('click', handleLogout);
🔄 Fluxo de Execução¶
sequenceDiagram
participant User as Usuário
participant App as Aplicação
participant Complyr as window.complyr
participant LS as localStorage
participant GTM as Google Tag Manager
participant FB as Facebook Pixel
participant API as Backend API
User->>App: Clica "Excluir Dados"
App->>App: Confirmação dupla
App->>Complyr: revokeConsent(reason)
Complyr->>LS: Limpar complyr_consent
LS-->>Complyr: Limpo ✅
Complyr->>GTM: Bloquear scripts
GTM-->>Complyr: Bloqueado ✅
Complyr->>FB: Bloquear Pixel
FB-->>Complyr: Bloqueado ✅
Complyr->>Complyr: Remover cookies de rastreamento
Complyr->>API: POST /audit/consent-revoked
Note over API: Registra motivo, timestamp, user_id
API-->>Complyr: Registrado ✅
Complyr-->>App: void (concluído)
App->>API: DELETE /user/account
API-->>App: 200 OK
App->>App: Logout + Redirect
Note over User,API: Dados excluídos + LGPD compliance ✅ 🔒 Conformidade LGPD¶
Direito de Exclusão (Art. 18, VI)¶
O método revokeConsent() implementa o direito garantido pela LGPD:
LGPD Art. 18, VI: "O titular dos dados tem direito a obter do controlador, em relação aos dados do titular por ele tratados, a qualquer momento e mediante requisição: [...] VI - eliminação dos dados pessoais tratados com o consentimento do titular"
Implementação:
// Usuário solicita exclusão
window.complyr.revokeConsent(
'Solicitação de exclusão conforme LGPD Art. 18, VI'
);
// Resultado:
// 1. Consentimento revogado ✅
// 2. Rastreamento bloqueado ✅
// 3. Dados locais limpos ✅
// 4. Auditoria registrada ✅
Auditoria e Comprovação¶
Todos os eventos de revogação são registrados para auditoria:
Dados Registrados: - Timestamp da revogação - User ID (se autenticado) - Motivo fornecido - IP address do usuário - User agent (navegador) - Workspace ID
Benefícios: - ✅ Prova de conformidade com LGPD - ✅ Histórico de solicitações do titular - ✅ Rastreabilidade para fiscalização ANPD - ✅ Base legal para defesa em disputas
Prazo de Atendimento¶
A LGPD exige atendimento imediato ou em prazo razoável:
- Revogação de Consentimento: ✅ Imediato (via
revokeConsent()) - Bloqueio de Rastreamento: ✅ Imediato (scripts bloqueados)
- Exclusão de Dados no Backend: Até 15 dias (via API própria)
// Bloqueio imediato
window.complyr.revokeConsent(reason);
// → Scripts bloqueados AGORA
// Exclusão backend (assíncrono, até 15 dias)
await api.deleteUserAccount();
// → Dados excluídos conforme prazo legal
⚠️ Tratamento de Erros¶
Erros Comuns¶
1. Complyr Não Carregado¶
// ❌ ERRO
window.complyr.revokeConsent('Motivo');
// TypeError: Cannot read property 'revokeConsent' of undefined
// ✅ SOLUÇÃO
if (window.complyr && typeof window.complyr.revokeConsent === 'function') {
window.complyr.revokeConsent('Usuário solicitou exclusão - LGPD Art. 18, VI');
} else {
console.warn('Complyr não disponível');
// Prosseguir com exclusão de dados no backend mesmo assim
}
Try/Catch Recomendado¶
async function handleDataDeletion(reason) {
try {
// 1. Revogar consentimento (sempre tentar, mesmo se falhar)
try {
if (window.complyr) {
window.complyr.revokeConsent(reason);
console.log('✅ Consentimento revogado via Complyr');
}
} catch (complyrError) {
console.warn('⚠️ Erro ao revogar consentimento:', complyrError);
// Não bloquear processo se Complyr falhar
}
// 2. Deletar dados no backend (crítico)
const response = await fetch('/api/user/delete-account', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
reason: reason,
lgpd_article: 'Art. 18, VI',
}),
});
if (!response.ok) {
throw new Error('Falha ao deletar conta no servidor');
}
console.log('✅ Conta deletada no backend');
// 3. Logout
await logout();
// 4. Redirecionar
window.location.href = '/?data-deleted=true';
} catch (error) {
console.error('❌ Erro ao processar exclusão:', error);
// Enviar para sistema de logging
if (window.Sentry) {
Sentry.captureException(error, {
tags: { feature: 'data-deletion' },
extra: { reason },
});
}
// Exibir mensagem ao usuário
alert(
'Erro ao processar solicitação de exclusão.\n' +
'Entre em contato com o suporte: contato@exemplo.com'
);
}
}
🔍 Verificação e Debug¶
Console Logging¶
// Ativar logs detalhados
localStorage.setItem('complyr_debug', 'true');
location.reload();
// Revogar consentimento
window.complyr.revokeConsent('Teste de revogação');
// Verá logs como:
// [Complyr] Consent revoked
// [Complyr] Reason: Teste de revogação
// [Complyr] Clearing localStorage: complyr_consent
// [Complyr] Blocking GTM scripts
// [Complyr] Blocking Facebook Pixel
// [Complyr] Removing tracking cookies
// [Complyr] Audit event sent to backend
Verificar Bloqueio de Scripts¶
// Após revogar consentimento
window.complyr.revokeConsent('Teste');
// Verificar localStorage limpo
console.log('localStorage:', localStorage.getItem('complyr_consent'));
// → null ✅
// Tentar disparar evento GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'test_event',
value: 100,
});
// Verificar se evento foi bloqueado
console.log('dataLayer length:', window.dataLayer.length);
// → Não deve aumentar (bloqueado) ✅
// Tentar disparar evento Facebook Pixel
if (window.fbq) {
fbq('track', 'PageView');
}
// Verificar no Network tab do DevTools
// → Nenhuma requisição para facebook.com ✅
✅ Melhores Práticas¶
DOs ✅¶
// ✅ Sempre fornecer motivo claro
window.complyr.revokeConsent(
'Usuário solicitou exclusão de dados pessoais - LGPD Art. 18, VI'
);
// ✅ Confirmação dupla para ações críticas
const confirmed = confirm('Tem certeza que deseja excluir seus dados?');
if (confirmed) {
const doubleConfirmed = confirm('ATENÇÃO: Esta ação é IRREVERSÍVEL!');
if (doubleConfirmed) {
window.complyr.revokeConsent(reason);
}
}
// ✅ Combinar com exclusão de dados no backend
window.complyr.revokeConsent(reason);
await api.deleteUserAccount();
// ✅ Fazer logout após revogação
window.complyr.revokeConsent(reason);
await logout();
window.location.href = '/';
// ✅ Tratar erros graciosamente
try {
window.complyr.revokeConsent(reason);
} catch (error) {
console.error('Erro:', error);
// Prosseguir com exclusão mesmo se Complyr falhar
}
// ✅ Registrar ação no backend para auditoria
await api.post('/audit/data-deletion', {
reason: reason,
timestamp: new Date().toISOString(),
lgpd_article: 'Art. 18, VI',
});
DON'Ts ❌¶
// ❌ NÃO revogar sem confirmação
button.addEventListener('click', () => {
window.complyr.revokeConsent(); // Perigoso!
});
// ❌ NÃO revogar sem motivo (má prática de auditoria)
window.complyr.revokeConsent();
// Sempre forneça motivo para conformidade
// ❌ NÃO revogar para "limpar" temporariamente
window.complyr.revokeConsent('Reset temporário');
// Use openPreferences() para ajustes
// ❌ NÃO ignorar erros
window.complyr.revokeConsent(reason);
await api.deleteAccount(); // Se Complyr falhou, continuar?
// ❌ NÃO esquecer de fazer logout
window.complyr.revokeConsent(reason);
// Usuário continua logado com dados "excluídos"?
// ❌ NÃO usar para teste sem cuidado
window.complyr.revokeConsent('Teste');
// Isso afeta dados reais! Use ambiente de dev
🔗 Recursos Relacionados¶
Métodos da API: - loadPolicy() - Carregar e exibir políticas - identify() - Identificar usuários - acceptPolicy() - Aceitar políticas - openPreferences() - Ajustar preferências
Recursos: - window.complyr - Objeto global da API - Eventos JavaScript - Evento complyr:consent-revoked - Exemplos Práticos - Casos de uso completos
❓ Perguntas Frequentes¶
P: A revogação é imediata?¶
R: Sim! Scripts de rastreamento são bloqueados imediatamente e localStorage é limpo na mesma execução. Porém, a exclusão de dados no backend deve ser feita via API própria.
P: Posso reverter após revogar?¶
R: Não diretamente. O usuário precisa aceitar o consentimento novamente via banner ou modal de preferências.
P: O que acontece com dados já coletados?¶
R: revokeConsent() apenas BLOQUEIA coleta futura. Para excluir dados já armazenados no backend, você deve chamar sua API de exclusão de dados.
P: Preciso deletar a conta do usuário?¶
R: Não necessariamente. revokeConsent() revoga consentimento de rastreamento. A exclusão de conta é uma ação separada que você deve implementar no backend.
P: Como comprovar conformidade com LGPD?¶
R: O Complyr registra automaticamente eventos de revogação no backend com: - Timestamp - User ID - Motivo - IP address
Acesse o painel de auditoria para ver histórico completo.
P: E se o usuário revogar por engano?¶
R: O usuário pode aceitar consentimento novamente. Mas a ação de revogação é irreversível - dados locais são limpos permanentemente.
P: Funciona offline?¶
R: Sim, parcialmente. O bloqueio de scripts e limpeza de localStorage funcionam offline. Mas o registro de auditoria no backend requer conexão.
📞 Suporte¶
Dúvidas sobre revokeConsent()?
- FAQ Geral - Perguntas frequentes
- LGPD - Art. 18 - Lei completa
- Documentação Completa - Índice geral
- Email: contato@complyr.com.br