مدیریت هویت کاربران با userPseudoId در مرورگر
خلاصهٔ کاملتر
یه چالش رایج در وبسایتهای محتوایی اینه که بخوای رفتار کاربران رو دنبال کنی، بدون اینکه مجبور باشی اونا رو مجبور به ثبتنام یا لاگین کنی. راهحل این مقاله پیادهسازی یه userPseudoId هست — یه شناسه یکتا و ناشناس که در مرورگر کاربر ذخیره میشه و در بازدیدهای بعدی هم قابل بازیابیه.
ساختار کلی کد داخل یه شیء به اسم window.tns.user سازماندهی شده. این شیء متدهایی برای ساخت، ذخیره، بازیابی و پاکسازی شناسه داره. نکته جالب اینه که برای ساخت UUID اول سراغ crypto.randomUUID() مرن میره و اگه موجود نبود، یه fallback دستی داره:
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
uuid = crypto.randomUUID();
} else {
uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0;
var v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var userPseudoId = 'tns-' + uuid;برای ذخیرهسازی هم یه اولویتبندی سهمرحلهای داره: اول localStorage، بعد sessionStorage، و در نهایت کوکی. این باعث میشه حتی در محیطهایی که یکی از روشها بلاک شده باشه، سیستم همچنان کار کنه. انقضای شناسه هم کنار خودش ذخیره میشه تا موقع بازیابی چک بشه.
منطق بازیابی (getUserPseudoId) اول یه کش درونحافظهای چک میکنه؛ اگه شناسه قبلاً توی همون session خونده شده باشه، دیگه سراغ storage نمیره. اگه شناسه ذخیرهشده پیدا بشه ولی منقضی شده باشه، پاک میشه و یه شناسه جدید ساخته میشه:
if (currentTime > expiryTime) {
this._cleanupExpiredId();
storedId = null;
}
if (!storedId) {
storedId = this.generateUserPseudoId();
this.setUserPseudoId(storedId);
}یه بخش دیگهای از کد مربوط به ثبتنام خبرنامه هست. این سیستم با کمک async.series مراحل validate، subscribe، handleError و confirmation رو بهترتیب اجرا میکنه. اگه کاربر قبلاً unsubscribe کرده باشه، یه modal نشون میده و لینک resubscribe میده. در غیر این صورت پیام تأیید موفقیت نمایش داده میشه.
ابزار کوکی هم بهصورت یه سری utility function ساده پیاده شده. setCookie با پشتیبانی از samesite=lax و secure کوکی میذاره، و getCookie با optional chaining خیلی تمیز مقدار رو برمیگردونه:
window.tns.getCookie = function(key) {
return document.cookie
.split('; ')
.find((row) => row.startsWith(`${key}=`))
?.split('=')[1]
}در کل این پیادهسازی نشون میده چطور میشه بدون وابستگی به سرور یا احراز هویت، یه لایه شناسایی قابلاطمینان برای کاربران ناشناس داشت. ترکیب fallback چندمرحلهای برای storage، مدیریت انقضا، و کش داخلی، این سیستم رو هم قابلاعتماد هم بهینه میکنه.
نکات کلیدی:
userPseudoIdیه شناسه یکتا ناشناس برای ردیابی کاربران بدون لاگین هست- اولویت ذخیرهسازی:
localStorage←sessionStorage← کوکی - از
crypto.randomUUID()با fallback دستی برای ساخت UUID استفاده میشه - شناسه دارای تاریخ انقضاست و بعد از انقضا خودکار تجدید میشه
- یه کش درونحافظهای از خواندن مکرر storage جلوگیری میکنه
- سیستم خبرنامه با
async.seriesمراحل subscribe رو مدیریت میکنه




