最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些。
要实现扫码登录我们需要解决两个问题:
1.  在没有输入用户名及密码的情况下,如何解决权限安全问题?换句话讲,如何让服务器知道扫码二维码的客户端是一个合法的用户?
2.  服务器根据用户在客户端的选择如何实时在网页上作出相应的响应?

首先我们先理一下微信的实现思路,来方便我们理解解决这一难题的思路方向。微信登录的二维码实际上是将一个URL转换成二维码的形式,而通过微信客户端扫码后,无非就是打开了这个url, 我捕捉到的微信二维码的url为https://login.weixin.qq.com/l/YdmTu30I5A== ,这个url里的YdmTu30I5A==代表的是本次会话的唯一ID, 这个有点儿类似浏览器里的session id,通过这个ID,微信就能定向将确认结果反馈到网页上。使用微信二维码登录功能,需要有两个前提:一是客户端上需要安装微信app。 二是用户需要登录到到微信app。https://wx.qq.com/

node.js Websocket消息推送

 

为什么要有这两个条件呢?那是因为微信在确认是否允许登录到网页版的时候,微信需要提取当前app的登录信息并将上面的session ID一并发给服务器,这样服务器收到了登录信息和sessionID后就可以确认两件事:一是用来确认登录的客户端的用户是验证过的;二是通过session ID服务器知道将反馈结果推送到哪个网页。

所以针对第一点,我们的关键在于,在扫描前要确保用户是已经被验证过且合法的用户(验证方式可以是用户名+密码,也可以是一个secure key),在选择是否登录时将这个结果一并推送到服务器端,就好了。如果用户没有验证是否合法,可以像微信的处理方式一样直接告诉用户二维码不可识别或提示请先登录到app。

有了身份验证,那么现在就解决第二个问题,如何将反馈结果实时地显示在网页上呢?有朋友可能会说,客户端这边很简单发一个请求到后台就好了,而网页上用ajax定时发送到服务器端看是否有反馈。我不赞成这种做法,因为ajax轮询方式十分消耗客户端和服务器端资源!这里涉及到另一个技术-web实时推送技术,使用推送技术可以节约服务器端和客户端的资源,可以稳定地推送和接收任何消息。我在实现的过程中我采用了第三方推送服务-GoEasy推送,用它是实现非常简单,我们项目里的其他功能也用到了GoEasy web实时推送服务,所以在此我直接就用的GoEasy推送来将登录反馈结果推送到服务器。我的实现步骤非常简单,将传送的session ID作为客户端与网页端的通信channel,网页端订阅用session ID作为值得channel,客户端将验证结果和session ID发送到服务器端,服务器端可以通过这个channel主动将结果推送给网页版!如果客户端也需要做相应的反馈的话,那么客户端也只需要订阅这个channel,然后服务器端会同时将结果推送给网页版和客户端,收到消息后,就可以根据需求在goeasy的回调函数里做你想做的事情了。关于goeasy推送的使用,大家可以参考这篇博客: http://www.cnblogs.com/jishaochengduo/articles/5552645.html, 另外GoEasy推送官网上也有一个demo:GoEasy二维码扫码登录demo,大家可以去看看效果.

希望对大家有帮助,如有理解错误的地方,还请大家斧正。

最新文章

  1. php继承多态
  2. 【C语言学习趣事】_33_关于C语言和C++语言中的取余数(求模)的计算_有符号和无符号数的相互转换问题
  3. Python - twisted web 入门学习之一
  4. 关于python中带下划线的变量和函数 的意义
  5. CSS3计数器的使用-遁地龙卷风
  6. Mysql --分区表(7)Key分区
  7. linux下在某行的前一行或后一行添加内容
  8. substring()、 substr() 、slice()的区别:
  9. SQL计算实际工作日(天)及两个时间(工作日)间隔(小时)!
  10. 从wordcount 开始 mapreduce (C++\hadoop streaming模式)
  11. 使用SqlAlchemy时如何方便的取得dict数据、dumps成Json
  12. poj 3592 Instantaneous Transference
  13. 迷宫寻宝(一)(bfs)
  14. ios字符串计算高度总结
  15. java读取.properties配置文件的几种方法
  16. Python函数小节
  17. 2018-2019-2 网络对抗技术 20165337 Exp4 恶意代码分析
  18. 大数加法~HDU 1002 A + B Problem II
  19. [已解决]Cannot find one or more components.Please reinstall the application
  20. ScheduledThreadExecutor定时任务线程池

热门文章

  1. node.js中buffer需要知道的一些点
  2. web学习之开发环境的搭建
  3. Linux学习 :移植U-boot_2016.09到JZ2440开发板
  4. AngularJS的学习笔记(一)
  5. Asp.net MVC 数据注解与验证
  6. 2.4G/5G频段WLAN各国使用信道表
  7. export a java project to runable jar
  8. 开源一个完整的iOSApp《丁丁美图》供初学者学习
  9. mariadb配置允许远程访问方式
  10. C#打印条码与ZPL