背景:
因为一个生产问题引发我整理了这篇文章,目的是以一种简单的方式让所有的测试从根本上认识token,在以后对token相关的测试场景有一定的敏感度和标准动作指导,规避再犯这类生产问题。
BadCase:
【问题描述】:用户小程序私域方案页太阳码,登录页循环跳转,导致不能正常登录进入方案页
【影响范围】:token失效的小程序用户扫码进入私域方案,不能正常登录进入方案页
【原因分析】:登录态失效,在访问私域方案时候,webview页校验到token失效,跳转登录页的时候未验证token失效。两个页面的校验逻辑不一致导致出现该问题。
【事件过程】:这里不逃避,直视面对问题,分析过程找根因。
第一个why,为什么4.8号测试发现了这个问题,就把问题放过去了?
-
最开始发现这个问题的不是专门测试这个需求的测试,是测试其他需求的过程中测试发现了这个问题找到开发反馈,开发给的结论是测试使用小程序版本冲突,因为当时小程序生产版本和体验版本都有过使用记录,没有杀死进程,测试按照开发给的方式杀死小程序重新进入,试过后问题现象消失,能正常就认为开发解释的对,问题就放过去了
第二个why,为什么测试认为杀死进程再进就是能验证开发说的是对的?
-
因为没有深究和反向再次验证这个问题,操作了一次就认为这个这个验证方式是对的,也就想当然的认为开发说的是有道理的,再转念一想生产上用户也只能用到生产版本,并不能同时使用体验版和生产版,所以就说服了自己
第三个why,为什么执行用例的时候没有发现这个问题?
-
回顾翻看了用例,用例里也确实写了,这里的token需要存在且有效,但是执行的时候这个只重点关注了这次改造的公域免登涉及到的opentoken有效无效,没有重点关注到accesstoken无效的场景,只是按照私域用例走了主流程场景,没有考虑到私域验证登录这里也被改动了,且影响到了登录校验跳转
PS:当然这个BadCase里也反应出了一些别的问题,我们在这里不做分析,我们这篇文章就解决验证token的问题
一、token的工作原理
Token是一种在网络通信中用于身份验证和信息传递的机制。它通常是一个由服务器生成的字符串,包含了用户的身份信息、权限以及其他可能的数据。以下是Token的原理、验证方法和应用场景的介绍:
这里为了更好明白,更直观,直接用图画的形式解释:
1.token是前端存在缓存里一份,后端存在数据库里一份
2.验证token是否有效是拿前端从缓存里拿的token和后端存的token做对比,一致就算有效,不一致就算无效
3.token有效的时候不需要重新登录,token无效是需要重新登录重新获取新token
Token存放位置
Token 其实就是访问资源对凭证。一般是用户通过用户名和密码登录成功之后,服务器将登录凭证做数字签名,加密之后得到的字符串作为token。
它在用户登录成功之后会返回给客户端,客户端主要以下几种存储方式:
1、存储在localStorage中,每次调用接口的时候都把它当成一个字段传给后台
2、存储在cookie中,让它自动发送,不过缺点就是不能跨域
3、拿到之后存储在localStorage中,每次调用接口的时候放在HTTP请求头的Authorization字段里面。token 在客户端一般存放于localStorage、cookie、或sessionStorage中。
二、验证方法
1.无token,获取新token(比如第一次登录小程序、app、网站等)
2.有token,且有效(之前登录过小程序、app、网站,这个token在前端缓存里能取到,且没有过期)
3.有token,且无效(之前登录过小程序、app、网站,这个token在前端缓存里能取到,且已经过期)
如何模拟token过期的数据
1.从后端入手
-
改数据库里的token,可以把它改成一个和前端不一致的
-
也可以手动置无效(注销登录的方式)设置Token失效方法 -- 推荐
PS:对我们的现状来说,因为所有的用户信息都在用户中心,所以咱们没有用户中心的权限,自然改不成数据库,那就用手动置无效的方式
2.从前端入手
-
找到token存储的位置,localStorage、cookie、或sessionStorage中,修改token,改成和后端不一致的
-
同一个app、小程序换手机登录,让token过期后再,换回第一个设备,模拟token过期 -- 推荐
-
抓包,打断点拦截验证接口请求,然后再修改请求里的token信息,同理改成不一样的即可 如何用Charles打断点修改入参和返回结果
PS:因为前端存储的token有时候是加密的所以不好修改,也可能找不到是哪个字段,所以修改token来说可行性不高,推荐使用切换手机来模拟token失效