Sci论文 - 至繁归于至简,Sci论文网。 设为首页|加入收藏
当前位置:首页 > 计算机论文 > 正文

长轮询技术在微信扫码登录中的应用与实现论文

发布时间:2023-10-28 14:28:22 文章来源:SCI论文网 我要评论














SCI论文(www.lunwensci.com)
 
   摘 要:传统的应用系统在设计之初为避免非授权用户访问系统,大多采用验证用户名和密码的方式来进行身份鉴权,随 着应用系统的不断增加,越来越多的用户需要记住不同的用户名和密码,有的用户为了方便记忆会将自己使用的应用系统设置 为统一的用户名和密码,一旦发生数据泄漏,所有的应用系统数据都会受到威胁。本文结合长轮询技术,采用微信扫码的方式 实现应用系统的登录操作,与其他使用短轮询技术实现扫码登录不同的是,本文采用的技术更加节约服务器性能及带宽,效率 更加高效。

  关键词:长轮询,微信公众号,二维码

  Application and Implementation of Long Polling Technology in WeChat Scan Code Login

  LI Guangcan, YANG Zhiqin

  (Lijiang Culture and Tourism College, Lijiang Yunnan 674100)

  【Abstract】:In order to avoid unauthorized users from accessing the system at the beginning of design, traditional application systems mostly use the method of verifying user names and passwords for identity authentication. With the continuous increase of application systems, more and more users need to remember different users and passwords. Some users will set their own application systems as unified users and passwords to facilitate memory. Once data breach occurs, all application system data will be threatened. This article combines long polling technology and uses WeChat scanning code to achieve application system login operations. Unlike other methods that use short polling technology to achieve scanning code login, the technology used in this article is more efficient and saves server performance and bandwidth.

  【Key words】:long polling;WeChat;QR code

  引言

  目前很多企业或单位使用的系统都面临着类似的问 题 :应用系统越来越多,每个独立的应用系统都需要使 用一套各自的用户名及密码进行登录,每个系统对用户 名的使用、密码的复杂程序要求又不一致,导致用户在 使用过程中经常需要频繁的输入不同用户名及密码,甚 至有的用户为了省事,常常将自己习惯使用的用户名及 密码统一设置到每个应用系统,一旦发生数据泄漏,各 个应用系统的数据也将受到威胁。目前普遍使用的应 用系统多为 B/S 架构,采用 HTTP 请求进行数据交互, HTTP 请求的特点是“问答式”,服务端不会主动向客户端推送数据,长轮询技术发送一次 HTTP 请求实现 了后期“服务器主动推送数据”这一要求。为了方便用 户登录系统,减少不必要的环节,本文采用长轮询技术, 结合微信公众号 OAuth2.0 鉴权方式进行授权,从而实 现通过微信扫一扫功能即可实现各应用系统的登录。

  1 长轮询技术及短轮询技术

  长轮询技术就是客户端向服务器发送 Ajax 请求, 服务器接收到请求后保持与客户端的连接,直到服务器 检测到有新的数据才返回响应信息并关闭连接。

  短轮询技术是由客户端每隔一段时间(如每隔 2s)向 服务器发起一次请求。服务器接收到请求后检测数据是否有更新,如有更新则向客户端最新数据,如无则返回无新 数据提示。短轮询技术的请求响应交互图如图 1 所示。


\

 
  从图 1 中可以看出, 短轮询技术只要请求间隔时间 一到无论有无新数据都会发起一次请求,对于数据变化 小的应用场景,这样必然会带来大量的无效请求,会占 用服务器资源及带宽资源。

  长轮询技术是在短轮询技术的基础上发展起来的, 它与短轮询技术相比,在服务器端没有检测到数据更新 的情况下服务器会保持与客户端的连接不断开,直到服 务器检测到有新的数据更新或保持连接时间已到才会向 客户端发送信息并断开连接,这样能够节约带宽资源并 减少服务器资源的消耗。长轮询技术的请求响应交互图 如图 2 所示。


\

 
  长轮询技术一般用于 WebIM、ChatRoom 和一些需 要即时交互的网站应用中。例如 :网页版微信、WebQQ 等网站均使用的是长轮询技术来进行数据交互。

  2 微信公众号 OAuth2.0 鉴权

  用户在微信客户端中访问第三方网页,公众号可以 通过微信网页授权机制来获取用户基本信息, 进而实现业 务逻辑。通过微信公众平台开发文档的要求,可以获取到 每个用户在不同公众号下的唯一身份识别标识 OpenID, 在应用系统开发中,可以通过微信公众号 OAuth2.0 鉴 权方式获取每个用户的 OpneID 并存储到数据库中,后 期通过数据库查询出该 OpenID 对应的用户信息。

  3 微信扫码登录的原理

  微信扫码登录的基本原理是通过微信手机端程序扫 描电脑端生成的二维码并从中解析出相关数据,一般该 数据为一个链接地址,微信手机端程序跳转至该链接地 址,服务器端接收到相关数据,同时调用微信公众号 OAuth2.0 鉴权相关接口获取用户的 OpenID 信息,查 询该 OpenID 是否是数据库中已经存在的员工信息,进 而进行其他相关操作,并将操作结果返回给电脑端的浏 览器,电脑端浏览器接收到服务器返回的数据后再进行 相关操作。

  3.1 微信扫码登录操作过程

  微信扫码登录的过程分为如下几步 :

  (1)用户打开电脑端浏览器,输入相应系统地址, 此时页面会自动生成一个二维码 ;

  (2)登录微信手机客户端,点击“扫一扫”,扫描 上一步中电脑浏览中生成的二维码 ;

  (3)电脑端浏览器及手机客户端界面同时发生跳 转,电脑端浏览器上的二维码出现提示信息 :扫码成 功,请在手机上完成相应操作 ;手机客户端跳转至确认 登录界面。

  (4) 手机客户端上点击“确认登录”按钮,电脑端 浏览器跳转至应用系统首页。

  3.2 微信扫码登录原理分析

  每次打开应用系统登录的首页时系统都会自动生成 一个二维码,借助浏览器调试工具,会发现每次生成的 二维码都带有一串随机字符串,这个随机字符串是唯一 的,不会重复,通过这个全局唯一的身份标识,可以确 定页面的身份并保证扫描该二维码的登录用户。如图 3 所示。


\

 
  登录页面除了会生成唯一的身份标识外,还会每隔 一定时间就会向服务器发送一个请求来确定该二维码的 扫描状态,判断是否有用户扫描该二维码进行登录操作。如图 4 所示。


\

 
  由图 4 可以看出,每经过 10s 电脑端浏览器便会 向服务器发送一次请求,服务器返回的二维码的状态信 息,如图 5 所示。


\

 
  电脑端浏览器根据服务器返回的信息判断二维码的 相应状态做出相应动作。其业务流程如图 6 所示。


\


 
  4 微信扫码登录代码实现

  根据前面的论述,使用微信扫描登录二维码过程中 需要将生成的全局唯一标识存放到数据库中,以此实 现“耦合”, 完成数据交换。此处使用的数据库是 SQL Server 2008. 若追求高并发也可以使用 Redis 数据库, 开发语言为 C#+Jquery3.3.7.

  4.1 创建数据库表

  为便于数据交换,在数据库中创建 WeChat_Login 表。其表结构如图 7 所示。


\

 
  图 7 中 UID 字段用于存放系统生成的全局唯一标 识,该字段为主关键字,不允许重复,每个 UID 代表 一个唯一的二维码。ZT 字段用于存放二维码扫码结果, 默认为 0.表示扫码登录失败, 1 表示扫码登录成功。 gh 字段用于存放扫码成功后对应的员工工号。smzt 字段用于存放二维码扫码状态,其有 2 个值 :WSM、 YSM,分别表示未扫码、已扫码,默认为 WSM。tjsj 字段用于存放该二维码生成的时间,通过当前系统时间 与 tjsj 做比较,可以判断该二维码是否在有效期内。

        4.2 设计微信扫码登录页面

  当用户打开微信扫码登录页面时,系统根据一定的 算法产生一个随机字符串,为确保产生的随机字符串全 局唯一, 此处使用 MD5 加密技术加密当前系统时间戳 的方法来生成。代码如下 :

  string result = string.Empty;

  // 获取当前系统时间

  string sjc = DateTime.Now.ToString("yyyy MMddHHmmssfff");

  // 加密

  result = System.Web.Security.FormsAuthentication.

  HashPasswordForStoringInConfigFile(sjc, "MD5"). ToString();

  return result.ToString();

  在页面加载事件中调用随机字符串生成函数, 同时将 该随机字符串存入到数据库表中去。然后利用 qrcode.js 生成二维码,该二维码是一个包含微信公众号 OAuth2.0 鉴权调用接口及刚刚生成的随机字符串的 URL,代码 如下 :

  // 生成一个随机字符串

  string uid = GenerateRandomCode();

  ViewState["uid"] = uid;

  // 将生成的随机数插入数据库

  string sql = string.Format("insert into wxdluid (uid,zt,tjsj) values('{0}','0','{1}')", uid, DateTime. Now. ToString());

  DB_RKJF.ExcuteSQL(sql);

  // 生成二维码链接地址

  ViewState["ljdz"] = "https://open.weixin.qq.com/ connect/oauth2/authorize?appid= 微信公众号 ID &redirect_ uri= 跳转页面地址 &response_type= code&scope= snsapi_base&state=" + uid + "#wechat_redirect";

  上述代码中的微信公众号 AppID 及跳转页面地址 需根据实际情况进行填写,在此不做赘述。

  微信扫码登录页面加载完毕后,执行 Ajax 长轮询 算法,定时向服务器以异步的方法发起请求,不断检测 刚刚生成的二维码状态。Ajax 长轮询页面前端核心算 法如下 :

  
  4.3 设计服务器端二维码状态检测程序

  当 Ajax 发起长轮询后,服务器端要根据长轮询的 机制在服务器未获取到新的数据或设置的超时时间未到 前保持连接不断开,核心代码如下 :

  int SendTime = 10; // 最多等待时间

  string userID = ""; // 传入的随机字符串, 代表当 前生成的二维码

  int i = 0;// 计算超时时间(秒)

  while (true)

  {

  Thread.Sleep(1000);// 停留一千毫秒(1s) i++;

  if (i < SendTime) // 判断是否达到超时时间

  {

  if (NameStr(userID) != "") // 调用 NameStr() 方法 判断是否有数据更新

  {

  context.Response.Write(NameStr(userID) ); break;

  }

  }

  if (i == SendTime) // 达到设置的超时时间将断开 连接并返回相关结果数据

  {

  context.Response.Write("fail: 无数据 "); break;

  }

  }

  在服务器端的长轮询核心算法中,设计了一个死循 环,无限执行二维码状态检查方法,通过方法返回的值 来判断是否跳出循环,同时为了防止因为网络延迟、客 户端掉线等特殊原因导致连接中断,而服务器端仍然在 执行相应二维码状态检查方法,造成服务器资源浪费 的情况出现,在算法中引入了保持连接时间参数这个变 量,一旦死循环执行时间达到了保持连接时间数,则中 止连接返回相关结果,这样就可有效避免服务器资源被 浪费。源代码中 NameStr() 方法用于检测数据库表中 是否有数据更新,具体算法读者可自行设计。

  4.4 设计手机端扫码跳转页面

  当用户使用手机端微信扫描电脑端浏览上的二维 码时,实际上手机端微信程序是打开了微信公众号 OAuth2.0 鉴权接口链接,这个链接前面已经介绍过,它 携带了一个已经存入到数据库表中的随机字符串,根据 微信公众平台接口文档,只要根据接口文档的要求传入 相关的关键参数(每个微信公众号中都可查看到),如果 要求传入的参数正确,微信公众号 OAuth2.0 鉴权会将 页面跳转至参数中指定的页面中去。具体微信公众平台 接 口文档可参考该链接 :https://developers.weixin. qq.com/doc/offiaccount/OA Web_Apps/Wechat_ webpage_authorization.html。

  微信公众号 OAuth2.0 鉴权包含若干接口,根据微 信扫码登录原理分析,希望通过微信扫码后获取到扫码 者的 OpenID,然后利用该 OpenID 查询到与之对应 的员工,再判断该员工是否有权限登录。微信公众号 OAuth2.0 鉴权中对于获取用户 OpenID 有两种方法 : 无感知式及有感知式。简单来讲,无感知式即用户使用微信扫码后直接会跳转到相关业务逻辑处理页面,在此 过程中页面不会有任何变化和提示,但这种方式仅能获 取用户的 OpenID 信息 ;有感知式即用户使用微信扫 码后首先会弹出页面授权界面,询问用户是否愿意授权 当前使用的程序获取用户相关信息,包括 OpenID、用 户昵称、用户备注及地理位置信息等。为提高微信扫码 登录的使用体验,此处程序使用的是无感知式获取用户 OpenID 信息。

  实现代码算法如下 :

  string openid;

  //code 参数是微信公众平台在跳转时自动生成的字 符串,通过该字符串可换取到相应的接口权限

  string code = Request.QueryString["code"];

  // 传入的 state 参数即是扫码时携带的唯一标识随 机字符串

  ViewState["uid"] = Request.QueryString ["state"];

  // 通过调用 GetPageContent() 方法获取微信公众 平台的接口数据,具体开发文档可查年微信公众平台开 发者文档

  string html = HttpSend.GetPageContent ("https:// api.weixin.qq.com/sns/oauth2/access_ token?appid= 微信公众号 ID&secret= 微信公众号 secret&code=" + code +"&grant_type=authorization_ code", Encoding. UTF8);

  string key = "\"openid\":\"";

  int startIndex = html.IndexOf(key);

  if (startIndex != -1)

  {

  int endIndex = html.IndexOf("\",", startIndex);

  // 从接口返回的数据中解析出我们需要的 OpenID

  openid = html.Substring(startIndex + key.Length, endIndex - startIndex - key.Length);

  ViewState["openid"] = openid;

  // 使用获取到的 OpenID 查询本地数据库中与之对 应的员工信息

  string sql = string.Format("select count(*) from wxbd_js where openid='{0}'", openid);

  int result = (int)DB1.GetScalar(sql);

  if (result >= 1)

  {

  string sqlxm = string.Format("select * from wxbd_js where openid='{0}'", openid);

  SqlDataReader drxm = DB1.GetDataReader (sqlxm);

  while (drxm.Read())

  {

  ViewState["gh"] = drxm["gh"].ToString();

  }

  drxm.Close();

  // 当本页面运行时即可将该二维码扫码状态修改 为”ysm”

  string sqlxg = string.Format("update wxdluid set smzt='ysm' where uid='{0}'", ViewState["uid"]);

  DB.ExcuteSQL(sqlxg);

  }

  else

  {

  Response.Write("");

  Response.Write("");

  }

  }

  在该页面的设计中需要注意在获取到扫码用户的 OpenID 后一定要与本地数据库中存放的员工信息进行 比对,防止任意微信用户扫码即可完成登录。

  在该页面中还需要设计一个“确认登录”按钮,点 击该按钮后完成登录状态的修改,效果如图 8 所示。


\

 
  代码如下 :

  // 修改二维码登录状态为 1

  string sql = string.Format("update wxdluid set zt='1',gh='{0}' where uid='{1}'",ViewState["gh"],ViewS tate["uid"]);

  DB.ExcuteSQL(sql);

  // 引导至登录成功界面

  Response.Redirect("Tsgdl_cg.aspx");

  以上 4 个页面相互配合共同完成了使用微信扫码登 录业务系统的整个过程。

  5 结语

  随着二维码的不断普及,使用微信扫码登录某应用 系统的方式被越来越多的程序开发者所使用,它不仅可 避免每次登录系统都需要输入用户名及密码的繁琐,又 可以大大提高账户的安全性。本文详细梳理了微信扫码登录的原理及过程,同时采用 Ajax 长轮询技术避开了 使用短轮询技术带来的网络带宽占用、过多的无用请求 等缺点,文中提供的思路及算法可应用于任意 B/S 架构 的系统登录。

  参考文献

  [1] 张治国.扫码登录的安全性分析[J].计算机与网络,2017.43 (10):62.

  [2] 石维峰,黄辰.仿微信扫码登录系统的实现与改进[J].物联网 技术,2016.6(12):40-41.

  [3] 梁宏,魏庆.单服务号完成微信扫码登录的设计与实现[J].开 封大学学报,2020.34(4):91-93.

  [4] 陈彩云,李鹏.微信二维码授权登录网站的实现[J].现代计算 机(专业版),2017(1):70-72.

  [5] 林健.基于微信公众号的通用授权中心的设计与实现[J].数 字技术与应用,2019.37(8):151+154.

  [6] 郭银科,郑承承.基于微信小程序扫码点餐平台设计与实现 [J].网络安全和信息化,2022(2):84-86.

  [7] 虞俊超,王满意.基于二维码的高校实验室危险化学品安全 管理[J].实验室研究与探索,2021.40(2):307-310.

  [8] 龚兰兰,凌兴宏.基于微信公众号的有书共读系统的设计与 实现[J].工业控制计算机,2020.33(1):100-102.
 
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!

文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/65813.html

相关内容

发表评论

Sci论文网 - Sci论文发表 - Sci论文修改润色 - Sci论文期刊 - Sci论文代发
Copyright © Sci论文网 版权所有 | SCI论文网手机版 | 鄂ICP备2022005580号-2 | 网站地图xml | 百度地图xml