最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些。
要实现扫码登录我们需要解决两个问题:
1. 在没有输入用户名及密码的情况下,如何解决权限安全问题?换句话讲,如何让服务器知道扫码二维码的客户端是一个合法的用户?
2. 服务器根据用户在客户端的选择如何实时在网页上作出相应的响应?
首先我们先理一下微信的实现思路,来方便我们理解解决这一难题的思路方向。微信登录的二维码实际上是将一个URL转换成二维码的形式,而通过微信客户端扫码后,无非就是打开了这个url, 我捕捉到的微信二维码的url为https://login.weixin.qq.com/l/YdmTu30I5A== ,这个url里的YdmTu30I5A==代表的是本次会话的唯一ID, 这个有点儿类似浏览器里的session id,通过这个ID,微信就能定向将确认结果反馈到网页上。使用微信二维码登录功能,需要有两个前提:一是客户端上需要安装微信app。二是用户需要登录到到微信app。https://wx.qq.com/
为什么要有这两个条件呢?那是因为微信在确认是否允许登录到网页版的时候,微信需要提取当前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,大家可以去看看效果.
希望对大家有帮助,如有理解错误的地方,还请大家斧正。
相关推荐
采用Websocket实现的单设备登录的SpringBoot的后端部分
微信网页扫码登录 前端技术vue.js+后端技术SpringBoot,spring项目也适用 扫码登录,websocket简历建立长连接,登录成功回调服务器接口,并异步同事前端登录成功
集成websocket实现实时通信.zip
webSocket实现Android客户端之间简单的通讯,或者群发
本项目为spring-boot+webSocket实现的向日葵远程控制项目 向日葵是一款很好用的远程操作软件。 一直很好奇这种软件的基本原理是如何的? 今天带大家通过一个简单的项目来探究一下,并实现一个简单的远程操控软件 ...
java 基于websocket实现的视频聊天,解压项目到对应位置部署到tomcat8即可使用
这里基于微信公众平台的带参数临时二维码,并且结合 Swoole 的 WebSocket 服务实现扫码登录。大体流程如下: 客户端打开登录界面,连接到 WebSocket 服务 WebScoket 服务生成带参数二维码返回给客户端 用户扫描...
使用Java-WebSocket开源框架开发Android端即时通讯功能。主要功能: 1、与websocket建立长连接 2、与websocket进行即时通讯 3、Service和Activity之间通讯和UI更新 4、弹出消息通知(包括锁屏通知) 5、心跳检测和重...
采用Websocket实现的单设备登录的react前端部分,采用了前后端分离的开发模式。
基于tomcat的websocket,实现的一对一通讯,支持https协议。
本项目基于Spring平台,整合websocket协议,实现一个简易web聊天室的功能。主要特性如下: 1.包含聊天室登录、退出的功能。登录时,浏览器自动向服务器发起websocket连接,退出时自动切断。登录页面为...
java 基于websocket实现的视频聊天,解压项目到对应位置部署到tomcat8即可使用
php使用webSocket实现Echarts长连接自动刷新的解决方案,见:https://blog.csdn.net/weixin_41290949/article/details/109099216
springmvc4.0 websocket实现用户登录挤退功能,即类似QQ,B地账号登陆,A地被退出。Mysql数据库与tomcat服务器,将脚本在执行,运行工程,登录即可查看效果。
基于WebSocket实现网页版聊天,支持一对一聊天,功能包含登录页面、对话界面、好友列表、上下线提醒等。 运行步骤: 1、获取GoEasy Appkey 先到GoEasy官网(https://www.goeasy.io)注册一个账号,登录后,创建一...
这是一个php实现websocket客户端的类,网上大部分是使用JS实现的。这是纯php实现客户端,不是JS。
这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.
本项目基于Spring平台,整合websocket协议,实现一个简易web聊天室的功能。主要特性如下: 1.包含聊天室登录、退出的功能。登录时,浏览器自动向服务器发起websocket连接,退出时自动切断。 2.登录后,用户可查看到...
应读者要求 写个了一个简单地springboot+websocket实现进度条的demo。