不得已用url传递用户身份验证信息,但用户把这个连接分享别人后,别人也能登录他的账号

处理

url传参 用户分享问题 - 图1

三中情形

服务端返回一个url
http://test.com/?token=123

情形一:目标用户第一次进入

  1. 存储这个token到localStorage中
  2. 重写这个url —-> http://test.com/?token=***&flag=1
  3. 从localStorage取数据使用

情形二:目标用户第二次进入

  1. 因为有了这个flag,不再重写url,也不再存储参数
  2. 从localStorage取数据,因为第一次已经存储过了,可以直接取到。

情形三:目标用户分享了给别人

  1. 因为有了这个flag,不再重写url,也不再存储参数
  2. 从localStorage取数据,取不到,”请以正确的方式进入”

情形四:目标用户自己缓存清干净了

无法处理。

  1. 因为有了这个flag,不再重写url,也不再存储参数
  2. 从localStorage取数据,取不到,提示 “请以正确的方式进入”

不过这种已经过滤的很罕见了,产品多少人用还不知道呢,不要捡了芝麻忘了西瓜。把时间花费在解决这个极小数的问题上是不值的,用户也会对于产品有一定的bug忍受度。

基本代码

  1. function getToken(url) {
  2. const urlParam = url.slice(url.indexOf('?'))
  3. const mURLSearchParams = new URLSearchParams(urlParam)
  4. if (!mURLSearchParams.has('flag')) {
  5. localStorage.setItem("token", mURLSearchParams.get('token'));
  6. history.pushState("", "", "?token=***&flag=1"); // 改变url参数
  7. }
  8. const token = localStorage.getItem("token");
  9. if (token === null) {
  10. alert('请通过正确方式进入')
  11. return
  12. }
  13. return token
  14. }
  15. getToken("http://test.com/?token=123")
  16. // getToken("http://test.com/?token=***&flag=1")