web端如何判断手机设备的唯一性
背景
一个考勤的系统,不希望一台设备在相同时间段使用两个账号同时签到两次(代签),所以就需要判断是否为同一台手机设备
解决过程
1.首先想到使用navigator,发现信息过少,只能用来判断是否为pc,Android和iPhone还有浏览器类型
2.然后查资料找到使用搜狐的接口http://pv.sohu.com/cityjson获取设备信息,试了一下,结果信息不准确
3.然后找到了可以获取设备ip地址的方法:
function getIPs(callback) {
let ip_dups = {}
// compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection
// bypass naive webrtc blocking
if (!RTCPeerConnection) {
var iframe = document.createElement("iframe")
// invalidate content script
iframe.sandbox = "allow-same-origin"
iframe.style.display = "none"
document.body.appendChild(iframe)
var win = iframe.contentWindow
window.RTCPeerConnection = win.RTCPeerConnection
window.mozRTCPeerConnection = win.mozRTCPeerConnection
window.webkitRTCPeerConnection = win.webkitRTCPeerConnection
RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection
}
var mediaConstraints = {
optional: [{RtpDataChannels: true}] }
//firefox already has a default stun server in about:config
// media.peerconnection.default_iceservers =
// [{"url": "stun:stun.services.mozilla.com"}] var servers = undefined
//add same stun server for chrome
if (window.webkitRTCPeerConnection)
var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints)
//listen for candidate events
pc.onicecandidate = function(ice) {
//skip non-candidate events
if (ice.candidate) {
//match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
var ip_addr = ip_regex.exec(ice.candidate.candidate)[1]
//remove duplicates
if(ip_dups[ip_addr] === undefined)
callback(ip_addr)
ip_dups[ip_addr] = true
}
}
//create a bogus data channel
pc.createDataChannel("")
//create an offer sdp
pc.createOffer(function(result){
//trigger the stun server request
pc.setLocalDescription(result, function(){}, function(){})
}, function(){})
},
getIPs(function(ip){
// alert("本机IP地址为:" + ip)
})
但是手机的ip地址是可以改变的。。。
4.然后找到了一种解决办法,需要借助hbuilder生成app壳,使用下列代码:
plusReady(){
alert( "uuid: "+plus.device.uuid )
},
if (window.plus) {
plusReady()
} else {
document.addEventListener("plusready", plusReady)
}
最后
还在找有没有纯web端就能实现这个功能的方法