您好, 访客   登录/注册

基于微信公众号的通用授权中心的设计与实现

来源:用户上传      作者:

  摘要:本文介绍了基于微信OAuth2.0用户授权的通用型登录入口的设计方案,该系统无需搭载额外的数据库,易于部署。跟微信官方提供的用户授权方式不同的地方在于本系统使用了前后端结合的长轮询技术,让服务端和客户端都第一时间感知用户是否已经扫码,并进行下一步登录操作。本系统可以作为中小型企业的授权中心使用。
  关键词:微信公众号;二维码;设计
  中图分类号:TP309 文献标识码:A 文章编号:1007-9416(2019)08-0151-01
  1 项目背景及需求
  目前很多单位或者企业的内部系统都面临着这样的问题:独立开发的系统越来越多,每个系统又有一套独立的账号密码,比如用身份证号、员工工号、员工姓名(汉字/拼音)作为账号的,密码的复杂度要求也不完全一致,导致用户使用起来非常不便,更不用说各个系统之间的用户数据如何进行对接了。而市面上很多系统都支持微信扫码登录,对于拥有微信公众号的企业或者个人来说,可以通过微信OAuth2.0鉴权方式进行授权,本系统就是利用这一点,做到统一授权。
  2 系统设计
  本系统使用了ASP.NET MVC4后端架构,运行在IIS 7.5服务器上。前端主要使用Bootstrap框架实现用户界面。数据库不是必须的,原因是授权中心原则上只负责用户的鉴权,不负责用户数据的保存。用户数据应该存放在各个子应用里面。在有需要的情况下也可以用数据库把用户信息保存起来,每次进行授权时再进行更新,因为诸如微信昵称、微信头像这种数据,用户有可能不定期进行更改[1]。
  整个用户授权流程设计如:
  (1)客户端生成一个随机ID作为本次扫码的唯一标识,该ID作为服务端接口(url)的参数,并以此生成二维码供用户扫描。
  (2)客户端向服务端发起长轮询监听异步请求,检测是否有用户扫描二维码。这个请求可以用jQuery的Ajax函数发起,但由于服务端和调用的客户端一般不在同个域名下,在服务端返回的响应里面,要注意加入适当的响应头以避免浏览器同源策略限制。
  (3)服务端收到监听请求,开始不断扫描某个全局变量(一个键值对集合),这个过程会持续若干秒(目前是27秒,設置每100毫秒扫描一次,重复270次);1)27秒内,若无检测到用户扫码,则服务端返回一个无扫码的响应,客户端接收到这个响应后,在异步请求的回调函数里面,重新发起新一轮监听(可以用函数递归实现);2)27秒内,若有用户扫码,则服务端把用户请求重定向到微信官方OAuth2.0的接口,通过该接口获取用户头像、openId等信息。
  (4)重定向后转入正常的微信OAuth2.0授权过程;1)重定向到微信OAuth2.0接口url,微信服务器会分配一个临时的code;2)服务端根据这个临时的code向微信服务器换取用于访问用户数据的token;3)服务端利用该token从微信服务器申请获取用户数据,包括用户头像、openId、昵称等信息,至此微信OAuth2.0过程结束,回到服务端主流程。
  (5)服务端最终把从微信OAuth2.0获取到的用户数据,加上数字签名,返回给客户端,客户端利用同样的加密算法校验数字签名,判断返回数据的可信性,再使用该数据进行下一步登录操作,至此,属于本系统的流程结束。
  3 系统特色
  本系统的较为核心的功能就是服务端感知用户扫码,然后通知被扫码的客户端。这里涉及到Web即时通信技术。目前主流的实现方式有三种:轮询(polling);长轮询(long polling);WebSocket。
  这三者各有优劣,其中短轮询从代码实现上是最简单的,客户端定时向服务器发起一个请求,询问用户扫描的结果;长轮询相对短轮询来说代码实现要麻烦一点,客户端向服务器发起一个请求询问用户扫描结果,在这个期间,服务器不断检测释放有用户扫描,通过检测结果决定保持响应还是立刻返回扫描结果,这种方式也是目前网页版微信所使用的手段;最后是WebSocket,从用户体验上跟长轮询无异,而且WebSocket的实现也需要服务端对用户扫描结果进行不断的检测,从服务器压力来看跟长轮询相差不远,但服务端的代码量比前面两者大,出于对后期代码的维护性来考虑,最终选择了和微信网页版一样的长轮询来实现。
  4 系统目前使用情况
  本系统自开发完成以后,为一些项目提供了登录功能。比如2019年的广东省“攀登计划”“基于.NET Core 的轻量级仓库管理系统(项目编号 pdjh2019b0803)”,以及广州康盛网络科技公司开发的“电小智”产品管理后端都是用本系统作为其中一个登录入口的。开发者们表示,由于系统设计基于无状态的数字签名验证,不存在数据库的构建和移植,所以在一个新系统上部署起来非常方便,一般来说半小时左右即可完成前后端代码的整合。
  5 结语
  总之,本系统具备了一个中央授权系统所需要的基本功能,不过模块化程度还有待提升。未来打算把后端代码整合成一个独立的项目包上传到github上面,或者以微软公司nuget插件的形式供其他开发者下载使用。
  参考文献
  [1] 王兴建,陈平,田小萍.基于微信企业号的扫码认证授权的设计与实现[C].《中国计算机用户协会网络应用分会2018年第二十二届网络新技术与应用年会论文集,2018.
  Design and Implementation of General Authorization Center Based on Wechat Public Number
  LIN Jian
  (Guangdong Vocational College of Post and Telecom , Guangzhou Guangdong  510631)
  Abstract:This paper introduces the design of a universal login entry based on the user authorization of Wechat OAuth 2.0 , The system needs no additional database and is easy to deploy. The difference from the user authorization method provided by WeChat officially is that the system uses long polling technology combined with front and back ends. Let the server and the client know for the first time whether the user has scanned the code, and proceed to the next login operation. This system can be used as an authorization center for small and medium-sized enterprises.
  Key words:WeChat public number; two-dimensional code; design
转载注明来源:https://www.xzbu.com/8/view-15057974.htm