C/S和B/S结构下采集用户唯一标识的方案

272 阅读3分钟

当一个游客(用户)划过你(研发)的产品时,如何记录并识别该潜在客户是互联网产品实现的重要一环,而用户唯一标识便是用来区别并标识该潜在用户。

在移动设备中默认情况下只会安装一个某app(取决于软件包名和安装目录),形成一个用户与一款某app的一一对应关系,那么将MAC地址、IMEI、MEID、OAID、IDFA、CAID等作为用户标识可以基本满足要求。

近些年微信、支付宝、抖音、百度、等产品陆续出现,其在hybrid app模式下的相关产品各自维护着自己的用户标识(如openId)。

在web app内部,又该如何实现用户唯一标识?web app 几乎拿不到硬件设备相关标识,遂弃之。尽管web app能够临时生成一份随机数,可是区别用户的关键因素是什么呢?用户指纹、虹膜、面部识别等身体数字化信息?一般拿不到。用户IP?动态IP情况下就不行了。

用户身份这个级别来采集唯一标识怕是不行了,那么访问环境级别呢?如浏览器、webview等之间来采集用户唯一标识,想来可行,在客户端未存储情况下,通过数字化枚举依赖因素如ip、浏览器相关属性、salt、签名算法等来周期性动态生成用户唯一标识,遂可行。但也带来了标识具有周期性的缺陷(最新版fingerprint的id生命周期是几个周)。

若是在访问环境级别把生成和存储标识服务端生成呢?标识周期性问题也解决了。

背景

  • 目前活动、运营支撑等相关业务部分产品内部的用户标识符大多采用浏览器第三方工具库生成;
  • 兄弟app团队在app内部采用设备ID——deviceId,在app外部采用第三方工具库;
  • 第三方工具库版本较旧,容易出现不同用户而相同标识的现象;
  • 未采用神策、talkingdata等其他统计方案,共同使用无遗加重移动端网络体验负担;
  • 服务端人力资源有限,暂时无人力投入;

目标

  • 最大程度化实现当前用户的身份标识在同一业务系统中具有唯一性;
  • 保证不同用户、不同客户的身份标识在同一业务系统中一一对应;

采集环境

采集环境用户标识
学生端AppdeviceId
微信公众号openid
微信小程序openid
支付宝小程序userId
钉钉H5openid
钉钉小程序openid
常规浏览器
  • fingerprintjs
  • fingerprintjs2(内部源码与@fingerprintjs/fingerprintjs相同)
  • @fingerprintjs/fingerprintjs
  • 实现方案

    经组内讨论,优先采集当前环境内对应的用户标识,其次采集使用常规浏览器的用户标识,可保障用户标识永不重复。

    常规浏览器的用户标识的获取方案已经封装到logRecord.generateUUID(visitorId) 方法,请直接使用该API即可。内部实现方案具体如下:

    1. 废弃fingerprintjs,使用fingerprintjs2
    2. 添加时间戳作为熵之一,将生成的用户唯一标识存入本地永久存储localstorage
    3. 二次进来时,检查本地存储是否存在用户唯一标识,若存在则继续使用,若不存在则重复步骤二并取生成的新的用户唯一标识来用;