Piwik:如何跨域(PHP/JS)跟踪访问者(用户ID)

Piwik: How do I track a visitor (User ID) across domains (PHP/JS)?

本文关键字:跟踪 访问者 ID 用户 JS 何跨域 PHP Piwik      更新时间:2023-09-26

我想将当前访问者的IP链接到指定的用户ID(通过PHP),Piwik应该在几个(子)域中跟踪该用户ID。

有几个(子)域,我想给登录secure.example.com的访问者(IP)一个唯一的UserID,以便在所有其他域上跟踪他。登录时的链接"IP->UserID"应使用PHP(Piwik Tracking PHP Client->setUserId)。所有域(包括登录后的secure.example.com)上的"正常"页面跟踪应该基于JavaScript(Piwik JS跟踪片段)。

示例域:

  • www.example.com(站点ID 1)
  • support.example.com(站点ID 2)
  • secure.example.com(站点ID 3)
  • www.anotherexample.com(网站ID 4)

我当前的PHP登录跟踪代码(在secure.example.com/login上调用):

<?php
require_once 'PiwikTracker.php';
$siteId = 3;
$apiUrl = 'http://piwik.example.com/';
$userId = '[TESTUSER]';
$piwik = new PiwikTracker($siteId, $apiUrl);
$piwik->enableCookies('*.example.com');
$piwik->setIp($_SERVER['REMOTE_ADDR']);
$piwik->setUserId($userId);
$piwik->doTrackEvent('Login', 'Login', $userId);
?>

所有其他页面和域的JS跟踪代码(siteId更改):

<script type="text/javascript">
var _paq = _paq || [];
(function(){ var u="//piwik.example.com/";
    _paq.push(['setSiteId', 1]);
    _paq.push(['setCookieDomain', '*.example.com']);
    _paq.push(['setDomains', '*.example.com']);
    _paq.push(['setTrackerUrl', u+'piwik.php']);
    _paq.push(['trackPageView']);
    _paq.push(['enableLinkTracking']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.defer=true; g.async=true; g.src=u+'piwik.js';
    s.parentNode.insertBefore(g,s); }
)();
</script>

在Piwik config.ini.php中,我设置了以下值:

[Tracker]
enable_fingerprinting_across_websites=1
use_third_party_id_cookie = 1
visit_standard_length = 1800
window_look_back_for_visitor = 86400

我的问题是:当我登录到secure.example.com,然后访问support.example.com(或www.example.com等)时,Piwik不会将这些访问链接到我之前设置的UserID。此外,如果我覆盖当前访问者的UserID,它在Piwik后端不会更改。

从您尝试做的事情的描述来看,您可能会从设置的无状态状态中受益。我的后端也使用PHP。

JWT似乎很适合你。JWT本质上是一个加密的JSON令牌,您将其提供给客户端,然后客户端将令牌与每个请求一起发送给服务器,服务器验证该令牌,而不是试图维护会话。这意味着你可以让客户端将该令牌发送到你的任何一个域,并有一个标准系统来验证来自该客户端的任何请求。您可以将某些域甚至域内的区域列入白名单。

我已经链接了下面的白皮书。以及与之相关的其他一些相关链接。

请注意,建议在http请求标头中发送令牌。我使用授权承载标头。但我看到一些使用cookie的实现,他们建议不要以查询字符串的形式发送。

可以肯定的是,这就是大型组织如何在网上如此彻底地跟踪你的原因。

无状态设计的设置非常有趣,因为需要对向后端发出的每个请求进行身份验证。

希望这能有所帮助,如果你有任何问题,请告诉我。

JWT最佳实践

JWT白皮书

JWT索赔

JWT当前最佳实践(这可能是重复的,但我无论如何都读过)