miércoles, 21 de enero de 2015

Aceptación explícita de cookies Google Analytics / Universal Analytics para cumplir LSSI

La LSSI, y más concretamente su desarrollo en el RD 13/2012 de 30 de marzo, indica que el uso de cookies (y otros dispositivos de almacenamiento, como local storage de HTML5, o los etags) debe ser consentido por el usuario, tras haber sido adecuadamente informado de que elementos de alamacenamiento se utilizan y fines de los mismos.

Los prestadores de servicios podrán utilizar dispositivos de almacenamiento y recuperación de datos en equipos terminales de los destinatarios, a condición de que los mismos hayan dado su consentimiento después de que se les haya facilitado información clara y completa sobre su utilización, en particular, sobre los fines del tratamiento de los datos, con arreglo a lo dispuesto en la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.

Cuando sea técnicamente posible y eficaz, el consentimiento del destinatario para aceptar el tratamiento de los datos podrá facilitarse mediante el uso de los parámetros adecuados del navegador o de otras aplicaciones, siempre que aquél deba proceder a su configuración durante su instalación o actualización mediante una acción expresa a tal efecto.

Lo anterior no impedirá el posible almacenamiento o acceso de índole técnica al solo fin de efectuar la transmisión de una comunicación por una red de comunicaciones electrónicas o, en la medida que resulte estrictamente necesario, para la prestación de un servicio de la sociedad de la información expresamente solicitado por el destinatario.

Sin lugar a duda habréis visto muchas webs en las que se indica al usuario que se usan cookies y que si continúa navegando acepta el uso de las mismas. Esto es correcto, siempre y cuando se implemente adecuadamente. El error fundamental detrás de este mensaje es que, en gran cantidad de ocasiones, se fijan las cookies ANTES de que el usuario acepte o navegue.

Aquí dejo un script que he utilizado en algún sitio para realizar la carga de Analytics DESPUES de que el usuario haya aceptado.


// Identificación de la cuenta y sitio en Google Analytics
var gaAccountId = "Aqui el ID de Google Analytics";
var gaSiteName = "Aqui el dominio";
// Si se desea depurar en localhost, para que funcione analytics se debe usar el dominio 'none'
// var gaSiteName = { 'cookieDomain': 'none' };
// Nombre de la cookie en la que se guardan las preferencias del usuario respecto a cookies de terceros
var gaOptInCookieName = "gaOptIn";
// Selectores jQuery de:
// - Contenedor de la pregunta de cookies, para mostrarlo u ocultarlo según proceda. 
// - Elemento en el que el usuario hará clic para aceptar cookies
// - Elemento en el que el usuario hará clic para rechazar cookies
var gaPreferenceQuestionSelector = ".gaOptIn";
var gaOptInButtonSelector = ".gaOptInBtn";
var gaOptOutButtonSelector = ".gaOptOutBtn";

// Funciones para evaluar anteriores respuestas del usuario.
function gaHasNotExpressedPreference() {
    return ($.cookie(gaOptInCookieName) == undefined);
}

function gaHasOptedOut() {
    if (!gaHasNotExpressedPreference()) {
        return ($.cookie(gaOptInCookieName) == "No");
    }
    return false;
}

function gaHasOptedIn() {
    if (!gaHasNotExpressedPreference()) {
        return ($.cookie(gaOptInCookieName) == "Yes");
    }
    return false;
}

// Rechazo del uso de cookies
function gaOptOut() {
    window["ga-disable-" + gaAccountId] = true;
    $.cookie(gaOptInCookieName, 'No', { expires: 720, path: '/' });
}

// Aceptación del uso de cookies
function gaOptIn() {
    window["ga-disable-" + gaAccountId] = false;
    $.cookie(gaOptInCookieName, 'Yes', { expires: 720, path: '/' });
    gaTrackPageView();
}

// Muestra la pregunta sobre el uso de cookies
function gaShowPreferenceQuestion() {
    var gaPreferenceQuestion = $(gaPreferenceQuestionSelector);
    if (gaPreferenceQuestion.length > 0) {
        gaPreferenceQuestion.slideDown("slow");
    }
}

// Oculta la pregunta del uso de cookies.
function gaHidePreferenceQuestion(slide) {
    var gaPreferenceQuestion = $(gaPreferenceQuestionSelector);
    if (gaPreferenceQuestion.length > 0) {
        if (slide) {
            gaPreferenceQuestion.slideUp("fast", function () {
                gaPreferenceQuestion.remove();
            });
        }
        else {
            gaPreferenceQuestion.remove();
        }
    }
}

// Realiza la inserción del script de analytics.
// Además, lanza el tracking de la página, para no perder el hit por no estar cargado el script de analytics.
function gaTrackPageView() {
    (function (i, s, o, g, r, a, m) {
        i['GoogleAnalyticsObject'] = r;
        i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date();
        a = s.createElement(o), m = s.getElementsByTagName(o)[0];
        a.async = 1;
        a.src = g;
        m.parentNode.insertBefore(a, m)
    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

    ga("create", gaAccountId, gaSiteName);
    ga("send", "pageview");
}

// Script de ejecución en carga de página. 
// Asocia los eventos a los elementos de aceptación y rechazo, 
// Evalua la cookie donde se almacenaron las preferencias del usuario para, en función de respuestas
// anteriores, lanzar o no el tracking de página y para mostra u ocultar el mensaje sobre cookies.
$(document).ready(function () {
    $(gaOptInButtonSelector).click(function () {
        gaOptIn();
        gaHidePreferenceQuestion(true);
    });

    $(gaOptOutButtonSelector).click(function () {
        gaOptOut();
        gaHidePreferenceQuestion(true);
    });

    if (gaHasNotExpressedPreference()) {
        window["ga-disable-" + gaAccountId] = true;
        gaShowPreferenceQuestion();
    }
    else if (gaHasOptedOut()) {
        gaHidePreferenceQuestion(false);
    }
    else {
        window["ga-disable-" + gaAccountId] = false;
        gaHidePreferenceQuestion(false);
        gaTrackPageView();
    }
});


Como podréis apreciar el script usa jQuery para realizar las operaciones con el DOM, así que si no podéis usar jQuery, tendréis que reescribir ciertas partes para adaptarlas a JavaScript estándar o a la librería JavaScript que utilicéis.

Por otro lado, y antes de que alguien pregunte (si alguien pasa alguna vez por aquí), se está fijando una cookie para registrar la preferencia del usuario, aunque diga que no quiere cookies. ¿Cómo es posible? Según dice que no, le fijamos una cookie. ¡Toma ya! Pues es correcto, porque esta cookie es lo que se considera una cookie de carácter técnico. La normativa permite el uso de cookies que sean necesarias para prestar un servicio que ha solicitado expresamente el usuario. Dentro de este paraguas estaría la cookie para guardar su preferencia, así como también la cookie de ASP.Net o de forms authentication para mantener la sesión del usuario.

No hay comentarios:

Publicar un comentario