技术学习:手机扫描电脑二维码登录原理
通用地实现方式(以登录电脑浏览器网页版微信为例):
1.每打开一次微信(Client)电脑浏览器网页时会随机生成一个含有唯一uid的二维码,每次刷新页面都会不一样(*这个可以保证一个uid只可以绑定一个帐号和密码,如果一个uid可以绑定多个帐号和密码,那么很可能你的电脑会登录别人的微信)
ps: 返回uid的目的是识别用户身份,而且实际上打开这个页面时浏览器已经和Server创建了一个长连接等待确认信息。这个页面在加载完毕时,也已经把很多登录后才需要的相关资源都预先加载进来了,所以长连接等待登录用户得到确认后展示用户信息速度很快,因为无需刷新页面和加载头像外的其他资源。
2.当用户在手机版微信访问这个页面进行确认时,Server已经同时获得了客户端信息,并通过之前保持的长连接告知浏览器。
3.浏览器展示完长连接里包含的用户信息(头像等)后,会重新开一个长连接等待客户端(手机)的确认操作。从安全角度来说,无论如何都不会让客户端(网页)获得微信账号和密码的。[要知道,密码这玩意儿腾讯自己都不敢保存]
*长连接实际是通过堵塞等待实现近乎实时的获得信息
*Open API 一般是通过授权令牌(Token)来解决的,原理是当用户通过授权后,分配一个限定条件下的令牌。(限制本机访问,限制授权有效时间,限制同时登录设备数等)
使获得授权的用户仅在有限的前提下就能访问相关服务。
*同时,整个授权过程的验证部分都在手机端进行,有效杜绝了PC端上泛滥的各类木马,安全工具的监听,大大降低了被盗号的风险。
总结:
核心过程:打开网页版微信登录界面后,浏览器会获得一个临时id,通过长连接等待客户端扫描带有此id的二维码后,从长连接中获得客户端上报给Server的帐号信息进行展示。并在客户端点击确认后,获得服务器授权的令牌(Token),进行随后的信息交互过程。(在超时,网络断开,其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程你形成有效的安全防护)
还没理解吗?没关系,看我根据思路画的图:
在CNODE上看到一位网友的想法:“用轮询做,大都是这样做,不然就是用长连接。首先扫码,二维码里面带有一个你生成的随机数,当微信回调你的服务器的时候进行验证,顺便记录下随机数,前台拿随机数去判断有没有登录成功。”
开始在网上搜集相关资料,最后进行整理。