最近在项目开发中, 需要用到统计用户登录的客户端浏览器, 用来防止一个账号多人使用的情况, 于是简单的调研了一下浏览器的指纹识别技术
首先, 考虑到使用 javascript 来查看 navigator, 看看能不能找到一些有用的信息, 寻找过程中, 找到了一个叫 fingerprintjs 的插件, 已经封装好了使用方法,
具体文档: https://github.com/fingerprintjs/fingerprintjs
试了试, 没有问题, 浏览器即使开启了无痕模式, 也可以正常检测到是同一个浏览器
看到这个名字, 突然想到, 微信支付里面好像有一个类似的东西
翻了好一会而微信支付的开发文档, 果然有一个:
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_7&index=6
背景介绍
由于用户网络使用代理或网络环境复杂的原因导致无法获取准确的用户端IP,商户侧可在统一下单时传递fingerprint参数给微信侧,用于辅助校验
这里需要注意,浏览器指纹并不能完全代替客户端IP(spbill_create_ip),也就是说在设置fingerprint字段的同时,spbill_create_ip字段也必须传递且不能乱传(如传内网IP,调起支付还是会引发拦截)
fingerprint设置步骤
1. 在下单面引入JS: https://wx.gtimg.com/wxpay_h5/fingerprint2.min.1.5.1.js
2. 调用Fingerprint2()获取浏览器指纹
1 2 3 4 5 6 |
<script type="text/javascript"> var fp=new Fingerprint2(); fp.get(function(result){ //result即为获取到的浏览器指纹值 }); </script> |
刚试了试, 效果也不错!
还有一种方案: 具体可以查看 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Authentication_API
用到的是service worker 中的push API。
Push API的作用就是根据用户的唯一表示进行主动消息推送的。
具体用法:
就像文档中所说,他最后会返回一个
对象
这个对象中的endpoint 就是浏览器Push 服务器来寻找客户端的依据,
可以直接拿来当设备唯一标识符了。
有个小小的问题: 你webapp必须具有通知权限(转载来自知乎)。