我想将当前访问者的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当前最佳实践(这可能是重复的,但我无论如何都读过)