Aller au contenu

Le visiteur connecté

Quand un visiteur est connecté à votre site, vous pouvez rattacher sa visite à son identifiant chez vous : toutes ses pages vues et ses événements de la visite le portent, y compris ceux d’avant la connexion, et ses visites précédentes sous le même cookie lui sont rapprochées. Les vues l’exposent en user_id et en person.

Dans les Réglages du site, cochez Accepter les visiteurs connectés. Tant qu’elle est désactivée, une identité reçue est ignorée — l’événement est gardé, sans identité — et comptée « Identité refusée » dans l’onglet Vérification.

Le jeton est un JWT HS256, signé par votre serveur avec le secret du site (Réglages du site › Secret). La signature empêche un visiteur de se faire passer pour un autre : ne le signez jamais dans le navigateur.

ClaimObligatoireRôle
subouil’identifiant du visiteur chez vous, 200 caractères au plus : rangé tel quel dans user_id
expouil’expiration du jeton ; un jeton expiré est refusé

Préférez un identifiant opaque (un numéro de client, un UUID) à une adresse e-mail : sub est lisible dans les vues, donc dans eodia insights.

import { SignJWT } from 'jose'
const secret = new TextEncoder().encode(process.env.EODIA_SITE_SECRET)
export async function eodiaIdentity(customerId) {
return new SignJWT({})
.setProtectedHeader({ alg: 'HS256', typ: 'JWT' })
.setSubject(String(customerId))
.setIssuedAt()
.setExpirationTime('12h')
.sign(secret)
}
<?php
// Sans bibliothèque : un JWT HS256 se signe en quelques lignes.
function eodia_identity(string $customerId, string $secret, int $ttl = 43200): string {
$b64 = fn (string $s) => rtrim(strtr(base64_encode($s), '+/', '-_'), '=');
$header = $b64(json_encode(['alg' => 'HS256', 'typ' => 'JWT']));
$payload = $b64(json_encode(['sub' => $customerId, 'iat' => time(), 'exp' => time() + $ttl]));
$signature = $b64(hash_hmac('sha256', "$header.$payload", $secret, true));
return "$header.$payload.$signature";
}
import os, time
import jwt # PyJWT
def eodia_identity(customer_id: str) -> str:
now = int(time.time())
return jwt.encode(
{"sub": str(customer_id), "iat": now, "exp": now + 12 * 3600},
os.environ["EODIA_SITE_SECRET"],
algorithm="HS256",
)

Dans la balise, si la page est rendue côté serveur :

<script defer src="https://stats.exemple.fr/a.js"
data-site="s_arvordemo001"
data-identity="<?= htmlspecialchars($jeton) ?>"></script>

Ou après coup, à la connexion, dans une application à page unique :

EodiaAnalytics.identify(jeton) // à la connexion
EodiaAnalytics.identify(null) // à la déconnexion

Les vues rapprochent les identités sans rien réécrire dans les données brutes :

  • dans la visite : user_id est l’identité vue au cours de la visite ; toutes les pages vues et tous les événements de la visite la portent, y compris ceux d’avant la connexion ;
  • d’une visite à l’autre : person vaut l’identité quand le cookie du visiteur s’est connecté au moins une fois, y compris pour ses visites antérieures ; sinon, l’identifiant du visiteur. C’est la colonne à compter pour des « personnes uniques » ;
  • un cookie vu sous deux identités (un appareil partagé) garde la plus récente pour person, et le cas est compté dans les chiffres de contrôle de l’onglet Vérification.

Sans cookie de mesure, le rapprochement se limite à la journée : le hachage du visiteur change chaque jour.

  • Régénérer, dans les Réglages du site, crée un nouveau secret, affiché une seule fois. L’ancien reste accepté 24 heures, le temps de déployer le nouveau.
  • Le secret est chiffré en base (AES-256-GCM) avec la clé de l’instance, SECRET_KEY.

Les demandes d’accès et d’effacement des personnes ainsi identifiées se traitent depuis le site : voir les droits des personnes.

eodia analytics est un logiciel libre d’Eodia.