在前文中,我们讲解了企业内网中常用的CAS登陆流程,并给出了用python实现的案例。然而,在互联网环境下,相对更方便、快捷、灵活的扫码登录方式才是主流。本文中,我们就详细来讲解一下扫码登陆的流程,并给出一个实际的案例来加深理解。在前文中,我们讲解了企业内网中常用的CAS登陆流程,并给出了用python实现的案例。然而,在互联网环境下,相对更方便、快捷、灵活的扫码登录方式才是主流。本文中,我们就详细来讲解一下扫码登陆的流程,并给出一个实际的案例来加深理解。
原理分析
扫码登陆的实现上,各家的细节不尽相同,但是基本的流程是类似的,大致如下:
带上token请求资源,获得有效cookie,正常访问资源。
网络分析
下面我们以JD的网站扫码登陆流程为例,进行网络交互分析,为后面的编码实现奠定基础。老规矩,浏览器打开F12开发者工具,访问登陆界面。很容易的在网络协议包中找到请求返回二维码的Get请求。如下图所示,响应正文中正是我们期望返回的二维码图像。
从图中可以看到请求的URL地址,并带了三个参数appid,size,t,前两个应该是固定值,第三个根据值的位数和开头1614也很容易猜到是时间戳。
浏览器返回的唯一标识KEY怎么判断是哪个呢,后面会进行反推,现在先继续往后看,查看浏览器发出的定时轮询包的格式。从包中可以看到,除了常规的字段外,还送了一个token字段,且每次GET请求的token字段是一样的,这个token应该就是网站给浏览器返回的唯一标识KEY了。
我们再回过头来仔细去看之前获取二维码的GET请求应答数据,可以在应答标头中找到这个token的值。如下图所示:
相当于这个唯一KEY放置在cookie中,我们编码实现的时候从cookie里取即可。
然后用APP扫码,分析出在未完成扫码、完成扫码未确认登陆、完成登陆三种场景下,网站分别返回的信息。如下图所示,从图中可以看出,提示内容还是非常明确的。在完成登陆的场景下,网站返回了一个ticket值,我们继续往后看浏览器是怎么应用这个ticket数据的。
从下图中可以看到,浏览器访问了一个验证ticket的地址,并通过参数t带上了ticket的值。在响应正文中,通过returnCode可以得知ticket校验成功。至此,一个扫码登陆的流程就结束了。
编码实现
获取二维码的实现如下所示,其中time.time() 可以返回当前时间的时间戳(1970纪元后经过的浮点秒数),由于整数位只有10位,而分析的包中时间戳是13位的,故乘以1000,将三位毫秒时间也纳入进来。
如下图所示,打开二维码图片文件等待app扫码过程中,程序每隔2s循环100次轮询扫码结果,等到返回结果为200时,保存ticket的值,并作为参数去服务器校验有效性,校验通过后,服务器会设置cookie有效,我们可以把cookie保存下来,下次就可以直接访问资源网站了。
本文通过一个实例,逐步分析并实现了利用Python进行扫码登录的示例。大家进一步实践加深理解。由于篇幅所限,需要完整示例代码的可以https://download.csdn.net/download/zhutou_xu/15499968 免费下载,有疑问的也欢迎在评论区留言交流。后续将推出更多python实战分享,喜欢的就点赞关注我吧。