最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些。
要实现扫码登录我们需要解决两个问题:
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,大家可以去看看效果.
希望对大家有帮助,如有理解错误的地方,还请大家斧正。
相关推荐
赠送jar包:jakarta.websocket-api-1.1.2.jar; 赠送原API文档:jakarta.websocket-api-1.1.2-javadoc.jar; 赠送源代码:jakarta.websocket-api-1.1.2-sources.jar; 赠送Maven依赖信息文件:jakarta.websocket-api...
本项目是一个基于websocket-sharp开源dll封装的在线聊天项目,服务端采用WinForm作为服务引擎。用于framwork4.5版本实现websocket。
赠送jar包:javax.websocket-api-1.1.jar; 赠送原API文档:javax.websocket-api-1.1-javadoc.jar; 赠送源代码:javax.websocket-api-1.1-sources.jar; 赠送Maven依赖信息文件:javax.websocket-api-1.1.pom; ...
WebSocket-FMP4与WebSocket-FLV视频播放器在Web端的应用是现代互联网实时通信技术的重要实践,其中wsplayer是一款常见的实现此类功能的播放器。本文将深入探讨WebSocket协议、FMP4与FLV格式以及wsplayer播放器的相关...
赠送jar包:jakarta.websocket-api-1.1.2.jar; 赠送原API文档:jakarta.websocket-api-1.1.2-javadoc.jar; 赠送源代码:jakarta.websocket-api-1.1.2-sources.jar; 赠送Maven依赖信息文件:jakarta.websocket-api...
WebSocket Sharp 是一个C#实现的WebSocket协议库,它支持客户端和服务端的功能,符合RFC 6455标准。这个组件不仅提供了基本的WebSocket连接管理,还包含了一些高级特性,如消息压缩、安全连接、HTTP身份验证、代理...
在C#中,可以使用.NET Framework或.NET Core的System.Net.WebSockets命名空间来实现WebSocket服务端和客户端。下面我们将详细探讨C# WebSocket的基础知识和示例。 **一、C# WebSocket服务端** 创建WebSocket服务端...
【Android WebSocket】Android 端 WebSocket 基本用法 ( 下载 Java-WebSocket源码 | 导入 Java-WebSocket-1.5.2 工程作为依赖 ) https://hanshuliang.blog.csdn.net/article/details/123633108 博客源码快照
Java-WebSocket jar包,封装WebSocket实现。
- GoEasy支持所有需要WebSocket通信的场景,如聊天、直播弹幕、用户上下线通知、在线用户列表、扫码功能、事件提醒、实时数据展示、在线拍卖、实时监控等,几乎涵盖所有需要实时交互的应用。 3. GoEasy的简单文档...
2. 处理HTTP Upgrade请求:当收到Upgrade请求时,检查请求头中的`Upgrade`字段是否为`websocket`,`Connection`字段是否包含`Upgrade`,并验证`Sec-WebSocket-Key`。 3. 建立WebSocket连接:通过`...
在本文中,我们将深入探讨如何使用C# WinForm和WebSocket技术实现文件传输。WebSocket是一种在客户端和服务器之间建立持久连接的协议,它极大地优化了实时通信,尤其适用于需要频繁交互和低延迟的应用,如文件传输。...
var ws = new WebSocket("ws://your-websocket-server-url"); ws.OnOpen += (sender, e) => Console.WriteLine("已连接"); ws.OnMessage += (sender, e) => Console.WriteLine("收到消息: " + e.Data); ws.OnClose +...
WebSocketSharp是一个针对C#开发的开源库,它允许开发者在.NET Framework 4.0和3.5环境下构建WebSocket服务和客户端。WebSocket协议是一种在互联网上实时通信(RTC)的技术,它提供了一种低延迟、全双工的通信机制,...
3. 接着,仔细分析`tio-websocket-showcase-master`中的代码,特别是`WebSocketHandler`的实现。 4. 最后,尝试修改示例代码,增加自己的业务逻辑,实践WebSocket的使用。 总的来说,`tio-websocket`是`t-io`框架的...
在本项目中,`websocket-sharp`库被用来实现WebSocket的功能。 首先,我们需要理解WebSocket的基本工作流程: 1. 客户端发起一个HTTP升级请求到服务器,请求升级到WebSocket协议。 2. 服务器接收到请求后,如果同意...
本篇将详细讲解如何使用C#来实现WebSocket,以及Fleck库在其中的作用。 首先,WebSocket协议基于HTTP的握手过程,但一旦连接建立,它就不再依赖HTTP,而是通过TCP直接通信。在C#中,我们可以利用.NET Framework或...
总的来说,这个"C# WebSocket使用实例"是一个很好的学习资源,它涵盖了WebSocket的基本概念和C#实现细节。通过研究和运行这个示例,开发者可以更好地理解和掌握WebSocket在实际项目中的应用,特别是在需要实时数据...
JavaWebsocket 1.5.2 jar包
WebSocket入门教程(四)-- WebSocket实例:实时获取服务器内存使用情况(优化一)详解:http://blog.csdn.net/u010136741/article/details/51590619