记一次跨域引起的坑
场景描述
今天运营的同事反馈说开户流程经过活体识别之后,重定向跳回了开户页面之后,直接跳出了登录,测试还说这个偶现问题。
以下通过开户的流程页面详细说明下这个情况
跳转到旷世开始活体识别
活体识别失败之后,旷世弹窗提示
此时点击退出验证,直接token失效
正常的行为应该是退出活体识别之后,重定向为之前那个页面,而不是直接登出了。但是问题是token清空,直接退出到登录页面了。
问题解决
由于测试说这个是偶现问题,所以我第一时间怀疑就是代码问题,赶紧打断点调试了半天,还是一无所获。经过多次失败之后,开始静下心来苦苦思索,为何有的链接活体识别跳转回来之后,token不会清空,而有的会清空。那清空只有一个可能性,那就是发生了跨域。因为token是放在localStorage里面的,当在同域的情况下是会存在token,因为之前登录过,登录之后token会保存在localStorage里。
要访问同一个localStorage对象,页面必须来自同一个域名。使用同一种协议,在同一个端口上。
基于此,我的猜想只能是活体识别回来之后,跨域了。但是域名跟端口都是一样的,那唯一的区别,那就是协议了。基于这个疑问,我又仔细查看了我用来测试的链接。发现有的是通过https协议来访问页面的,有的是通过http访问页面的,而我完完全全的忽略了这个点。测试同学也没有注意。然后继续验证我的猜想,分别以2个链接访问页面。发现一个特点。
- 当以http协议访问页面的时候,活体识别回来之后,token没有了,跳转到了登录页
- 当以https的时候,活体识别回来之后,能够停留在开户页面,没有跳出。
基于此,只能有一个断定,那就是活体识别回来之后,接口重定向开户页面的协议是https,这个时候,当以http协议访问页面的时候,接口重定向回来的链接是https协议的,存在跨域,没有token,直接跳转到登录页去了。这个解释完全能够将之前的场景全部覆盖。 于是赶紧跑到后端那里询问,果真如此,返回的还真是https协议的链接。由于之前并不是自己对接的这个项目,所以并不清楚这个情况,所以才花了好大的精力去发现这个问题的真相。也让我深刻的体会到,学好基础知识的重要性。很多坑爹的问题,都可以通过对基础知识的掌握,逐步推断解决的。