Consentimiento de cookies para Laravel

El banner es una etiqueta en tu layout Blade, antes de @vite. Los consentimientos que piden tus formularios (newsletter, condiciones) se registran desde el controlador con una llamada HTTP, cada uno con su justificante firmado.

Configúralo con tu agente de IA

Conecta el servidor MCP de Croombit a tu editor o agente de código y pega esto. Crea el sitio, las categorías de cookies y el banner, y edita tu código.

Con Croombit: crea un sitio para este proyecto y mantén las categorías de cookies que trae. Escribe el texto del banner y publícalo. Crea una clave publicable de TEST para localhost:3000. Es una app Laravel: añade la etiqueta de cmp.js al principio del <head> de resources/views/layouts/app.blade.php con la clave de config('services.croombit.key'), añade la entrada croombit a config/services.php y registra la casilla de newsletter de nuestro controlador de alta con Http::post a /v1/consent usando CROOMBIT_SECRET_KEY.

El agente trabaja en TEST. Pasar a LIVE son dos pasos en la consola: verificar tu dominio y cambiar a una clave LIVE; consulta pasar a LIVE.

O a mano

1. Claves en config/services.php

// config/services.php
'croombit' => [
    'key' => env('CROOMBIT_PUBLISHABLE_KEY'),   // pk_test_… locally, pk_live_… in production
    'secret' => env('CROOMBIT_SECRET_KEY'),     // sk_… — server only
],

2. Añade la etiqueta a tu layout

{{-- resources/views/layouts/app.blade.php --}}
<head>
    <meta charset="utf-8">
    <script src="https://croombit.com/cmp.js"
            data-tc-api-key="{{ config('services.croombit.key') }}"></script>
    {{-- …everything else after it --}}
    @vite(['resources/css/app.css', 'resources/js/app.js'])
</head>

3. Retén los rastreadores

Etiquetas en tus vistas Blade: type="text/plain" más data-tc-consent. Quedan inertes hasta que el visitante acepta esa categoría.

<script type="text/plain" data-tc-consent="analytics" async
        src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<script type="text/plain" data-tc-consent="analytics">
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-XXXX');
</script>

4. Registra consentimientos desde el controlador

Un POST /v1/consent normal con tu clave secreta, sin SDK. La cabecera Idempotency-Key hace que reintentar sea seguro. Consulta Registrar y consultar consentimiento.

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;

// e.g. in the controller that handles your signup form
Http::withToken(config('services.croombit.secret'))
    ->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
    ->post('https://api.croombit.com/v1/consent', [
        'subject' => 'email:' . $user->email,
        'purpose' => 'newsletter',
        'state' => $request->boolean('newsletter') ? 'GRANTED' : 'DENIED',
        'channel' => 'signup_form',
    ])
    ->throw();

Preguntas

Tengo una Content Security Policy. ¿Qué permito?

script-src https://croombit.com para el banner y connect-src https://api.croombit.com para sus llamadas.

¿Funciona con Inertia o Livewire?

Sí. La etiqueta vive en el layout Blade que los envuelve, así que se carga una vez, antes que tu app.