不得已用url传递用户身份验证信息,但用户把这个连接分享别人后,别人也能登录他的账号
处理
三中情形
服务端返回一个url
http://test.com/?token=123
情形一:目标用户第一次进入
- 存储这个token到localStorage中
- 重写这个url —-> http://test.com/?token=***&flag=1
- 从localStorage取数据使用
情形二:目标用户第二次进入
- 因为有了这个flag,不再重写url,也不再存储参数
- 从localStorage取数据,因为第一次已经存储过了,可以直接取到。
情形三:目标用户分享了给别人
- 因为有了这个flag,不再重写url,也不再存储参数
- 从localStorage取数据,取不到,”请以正确的方式进入”
情形四:目标用户自己缓存清干净了
无法处理。
- 因为有了这个flag,不再重写url,也不再存储参数
- 从localStorage取数据,取不到,提示 “请以正确的方式进入”
不过这种已经过滤的很罕见了,产品多少人用还不知道呢,不要捡了芝麻忘了西瓜。把时间花费在解决这个极小数的问题上是不值的,用户也会对于产品有一定的bug忍受度。
基本代码
function getToken(url) {
const urlParam = url.slice(url.indexOf('?'))
const mURLSearchParams = new URLSearchParams(urlParam)
if (!mURLSearchParams.has('flag')) {
localStorage.setItem("token", mURLSearchParams.get('token'));
history.pushState("", "", "?token=***&flag=1"); // 改变url参数
}
const token = localStorage.getItem("token");
if (token === null) {
alert('请通过正确方式进入')
return
}
return token
}
getToken("http://test.com/?token=123")
// getToken("http://test.com/?token=***&flag=1")