使用FreeHttp强制登出微信公众号登陆状态(实现~原理)
概述
我们使用的部分网站设计成一旦登录即不允许用户手动退出,现实场景中是没有问题的
但如果是在测试或调试过程中就会有强制登出的需求
如果当前使用的是PC浏览器,您或许可以通过调试模式清除保持登录信息的数据实现手动退出。
但是如果当前使用的手机WEB浏览器,或者其他web嵌入的方式(比如微信公众号)退出是十分困难的
下面以退出微信公众号下的京东到家为例,说明如何使用FreeHttp实现手动退出登录功能(FreeHttp 说明 https://www.cnblogs.com/lulianqi/p/10428551.html)
准备工作
1:您需要为您的移动设备设置Fiddler代理,并安装证书(手机代理及证书的安装您可以通过百度查询到相关文章)
2:FreeHttp的安装详见(https://www.cnblogs.com/lulianqi/p/10428551.html#a00)
3:进入微信登录京东到家(测试中使用iphone6s移动设备)
配置
如上图配置
- 1:这里需要选择一个session,该session包含该站点的登录信息的cookies,您可以逐个查找,当然如果您正在对该站进行测试或调试,您应该很清楚哪条请求包含这些信息
- 2:选择完session后,我们使用Quick Rule中的Remove Session Cookies快速创建规则
当您选择Remove Session Cookies后会弹出上图对话框,询问您是否需要修改Set-Cookie的属性信息(如果不需要修改直接关闭即可),因为有时候当前URL的域可能不是浏览器中Cookie的Domian,这个时候您可能需要添加一个Domian来手动指定
- 3:填写过滤规则,因为能不是每次都需要告诉终端让他清除cookies(事实上只需要一次就可以),这个Url一般都是主页html等关键请求(提示:您可以直接拖动session到输入框中,完成url的输入)
完成后您会发现『Response Modific』页Add Head加入了许多Set-Cookie(因为无法确认哪个cookie包含着登录信息,Remove Session Cookies会默认清除所有发现的cookie)
当然大多数情况作为测试或开发人员您是知道页面哪个cookie标识的用户状态,如果是这样您不需要使用Remove Session Cookies删除页面下所有cookie,而可以直接使用delete cookie手动指定需要删除的cookie即可
点击确认并设置规则生效
测试
- 现在您可以在微信里刷新京东到家当前页面
- 在列表中可以看到规则已经被匹配到,查看报表信息可以看到修改已经完成(黄色高亮session表示给请求是一个被FreeHttp修改过的请求)
- 这个时候再次查看微信公众号里的页面,您会发现当前已经处于未登录状态。
原理
- 因为Http本身是无状态的,如果要维护登录状态就需要应用层面实现。
一般应用会将登录状态放在客户端Cookie中(这样浏览器会帮助管理维护cookie),也有一些服务API会将令牌放在自定义header或查询字符串等其他参数中(这一般出现在需要跨平台的服务中,因为不是所有应用环境都是在浏览器中,有些嵌入式设备根本没有浏览器)。
这一点很好区分,您只需要对比登录状态下的请求与不登录状态下请求的全部即可
我们这里是要清除微信公众号应用的登录状态(大部分都是通过cookie来做到的)
- 最后问题变成如何清除指定cookie
我们知道浏览器中的cookie是一般由请求返回头中的Set-Cookie指定的,浏览器接收到该返回头即会为指定站点创建Cookie信息(详细内容可以看这里 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie)
在有调试模式的浏览器中我们很容易实现,直接右键删除,或通过js删除,不过对于没有调试模式的手机终端前面的方法看起来行不通了。
查看Set-Cookie规则,我们可以发现Max-Age属性(过期时间),那我们只要把过期时间设置的足够短不就可以骗过浏览器,让它删除我们想要删除的cookie
注意这里Set-Cookie是响应头,所有必须浏览器先发起一个请求然后我们修改该请求的响应头,把带有Max-Age=1属性的Set-Cookie写入就可以了(Set-Cookie: name=delete by FreeHttp; Max-Age=1;Path=/)
改响应的操作就直接通过Fiddler上的FreeHttp插件实现即可,操作即上文所述
FreeHttp详细使用方法见(https://www.cnblogs.com/lulianqi/p/10428551.html)