微信二维码用于图书馆读者身份认证的
实践
郭利敏1, 刘悦如2, 相明琼3
1上海图书馆上海科学技术情报研究所 上海 200031
2上海同济大学图书馆 上海 200092
3上海出入境检验检疫局 上海 200135
郭利敏, ORCID: 0000-0002-8138-2762, E-mail: lmguo@libnet.sh.cn。
摘要
目的

尝试将上海图书馆的“我的图书馆”系统与第三方平台(微信平台)进行整合, 利用微信二维码扫描功能优化读者登录操作, 以提高图书馆信息化服务水平。【应用背景】随着HTTP长连接技术的广泛应用, 微信、QQ、新浪微博等推出二维码登录服务。

方法

利用微信二维码结合HTTP长连接技术实现微信系统与“我的图书馆”系统间的交叉认证, 以实现二维码扫描登录“我的图书馆”系统。

结果

将二维码与认证系统相结合, 使读者可以通过扫描二维码的形式登录系统。

结论

为读者提供新的登录渠道, 方便读者使用, 同时进一步扩展二维码在图书馆的应用范围。

关键词: 微信二维码; 交叉认证; HTTP长连接
中图分类号:
Application of WeChat QR Code in Reader Authentication
Guo Limin1, Liu Yueru2, Xiang Mingqiong3
1Institute of Scientific and Technical Information of Shanghai, Shanghai Library, Shanghai 200031, China
2Tongji University Library, Shanghai 200092, China
3Shanghai Entry-Exit Inspection and Quarantine Bureau, Shanghai 200135, China
Abstract

[Objective] Integrate My-Library System with Shanghai Library WeChat System by QR Code to improve the level of library information service. [Context] With the application of HTTP Persistent Connection, WeChat, QQ, Sina Weibo provides QR Code login service. [Methods] Using WeChat QR Code and HTTP Persistent Connection to provide Cross-Validation Service betweend WeChat System and My-Library System, so readers can login My-Library System by scanning WeChat QR Code. [Results] Combining WeChat QR Code and authentication system, readers can login My-Library System by scanning QR Code. [Conclusions] Provide a new way to login My-Library System for the reader, and also expand the application of QR Code in library.

Keyword: WeChat; QR; Code; Cross-Validation; HTTP; Persistent; Connection
1 引 言

微信二维码[1]即带参数的二维码, 是一种含有特定数字内容且只能被微信软件扫描和解读的二维码, 早期配合“ 扫一扫” 功能用以添加微信好友、获取商家品牌和商品信息。由于具有良好的用户体验, “ 扫一扫” 功能已成为微信应用的一种用户习惯。自微信5.0后, 微信平台通过对微信公众服务号开放带参数二维码接口以及“ 扫一扫” 功能的增强和优化使得微信二维码成为线上线下(O2O)联动服务的介质。

二维码信息存储已被国内外图书馆广泛应用, 如慕尼黑工业大学图书馆[2]、南京大学图书馆[3]都将二维码嵌入到书目联机查询系统OPAC中用以存储馆藏位置、索书号等信息方便读者将书目信息存储到手机中; 上海图书馆利用二维码制作公共图书馆地图册以存储中心图书馆的信息。

近年来, 微信、QQ、新浪微博、支付宝等都将二维码与用户认证系统相结合, 利用客户端扫描二维码解决独立系统间的交叉认证问题, 在方便用户使用、丰富用户体验的同时, 也增强了系统的安全性。本文尝试利用微信二维码将微信系统和“ 我的图书馆” 系统相结合, 实现二维码扫描登录“ 我的图书馆” 系统。

2 系统设计与实现
2.1 问题的提出与解决方案

上海图书馆的“ 我的图书馆” 系统为读者提供在线个性化服务, 提供借阅信息查询、图书续借、到期提醒等服务, 有着大量的用户群体。2014年1月-7月“ 我的图书馆” 系统月平均登录次数约为86 000次。在系统运营过程中常有读者忘记密码、卡号/密码输入错误等导致系统登录失败的问题。上海图书馆微信系统自上线以来用户已超过32 000人, 用户验证率接近30%。如果将微信系统与“ 我的图书馆” 系统相结合, 利用微信二维码和微信“ 扫一扫” 功能为微信认证用户提供二维码登录渠道, 一方面可使读者免去输入卡号/密码的过程, 优化用户体验; 另一方面也可以减少读者个人信息泄漏的情况发生。

2.2 系统设计思路

解决上述问题的实质为运用微信二维码解决两个独立系统间的交叉认证问题, 即读者在“ 我的图书馆” 系统中, 通过扫描二维码进行用户认证, 并将认证结果反馈给“ 我的图书馆” 系统以登录该系统。如图1所示, 由于需要两个系统协同运作, 所以实现难点在于在多用户并发的情况下, 如何能够做到准确地访问控制。

图1 系统处理流程

具体实现中, 由于微信和“ 我的图书馆” 系统都处于外网环境, 所以需要利用加密技术提供一个互信访问通道。利用访问控制与HTTP长连接技术[4]确保读者扫描二维码认证通过后, 页面可以自动刷新自己的个人界面。如图2所示, 当用户打开二维码登录界面时, “ 我的图书馆” 系统会为用户分配一个二维码特征值用以从微信系统获取微信二维码。用户用微信扫描二维码后, 根据其微信中的个人信息进行用户验证并将结果主动推送给“ 我的图书馆” 系统; “ 我的图书馆” 系统在收到推送通知后从访问控制中找到用户的相关Session并对其相应的浏览器界面进行刷新, 从而进入后续的服务模块。

图2 系统处理流程

2.3 系统实现

依照上文的设计思路, 在上海图书馆(上图)微信系统和“ 我的图书馆” 系统中新增相应的功能模块, 如图3所示:

(1) 连接管理: 主要基于HTTP的异步长连接在客户端与服务器之间创建和保持稳定可靠连接, 在同一个连接中处理多个请求和响应, 用来处理来自二维码登录页面的HTTP请求, 生成并管理微信二维码特征值, 从微信系统获取微信二维码。如图4所示, 工作流程分为访问时和访问后两部分。

图4 连接管理模块流程

①访问时: 当用户访问二维码登录页面时, 连接管理模块会接收请求并为其生成一个特征值(不重复的长整型随机数), 通过互信访问通道从微信系统中获取相应的微信二维码并返回给登录页面。

②访问后: 当登录页面加载完微信二维码后, 利用Ajax技术向“ 我的图书馆” 系统发送一个连接请求, 连接管理模块会将该连接请求截获并阻塞, 同时根据特征码创建监听以接收来自微信系统的用户认证消息。若收到认证失败的监听结果或超时则登录失败, 反之则登录成功并将结果返回。

(2) 监听模块: 用以接收来自上图微信系统的认证消息, 并将结果返回给连接管理模块。该模块由监听接口、状态校验程序以及状态表组成。监听接口用于接收来自微信系统的认证结果并将其写入状态表。状态校验程序采用轮询机制, 如图5所示。在监听创建后, 程序会每隔3秒检查一次状态表是否有更新, 若有, 则将结果通知连接管理模块。

图5 监听模块流程

(3) 二维码管理: 主要基于微信二维码[5], 为每个用户创建一个唯一的有效时长为3分钟的临时二维码, 用以扫描登录系统。由二维码创建和二维码处理事件组成。

①二维码创建: 如图6所示, 从微信公众平台获取二维码, 根据scene_id(即上文提到的特征值)从微信平台获取的二维码票据Ticket(凭借此Ticket可以在有效时间内换取二维码), 随后利用二维码Ticket从微信公众平台换取微信二维码。详见微信公众平台开发者文档。

图6 二维码创建流程

②二维码处理事件: 当用户扫描二维码后, 微信系统会收到二维码扫描事件, 其内容包含FromUserName (发送方账号, OpenID), MsgType (消息类型, event), Event (事件类型, SCAN), EventKey (事件KEY值, 创建微信二维码时的scene_id即上文提到的特征值), Ticket (微信二维码的票据, 可用来换取二维码图片)。如图7所示, 当接收到来自微信公众平台的二维码消息事件后, 系统会从消息实体中提取二维码特征值和用户的OpenID, 并检查该用户是否有绑定读者证, 并将结果由互信访问通道推送至监听接口。

图7 微信二维码事件处理流程

(4) 互信访问: 互信访问通道采用签名认证的形式校验消息以保证消息的真实性。签名(Signature)由secret、timestamp、qr_scene三个参数构成, 参数详细描述如表 1所示:

表1 Signature参数表

签名采用SHA-1对由secret、timestamp、qr_scene三个参数按照字典排序拼接成的一个字符串进行加密而成。系统在接收消息后会将接收到的签名串(Signature)与自己生成的签名串进行比对, 若相同则表示消息源真实可靠。校验具体核心程序如下:

public static boolean checkSignature(String signature, String timestamp, String qr_scene) {

String[] arr = new String[] {secret, timestamp, qr_scene};

// 将secret、timestamp、qr_scene三个参数进行字典序排序

Arrays.sort(arr);

StringBuilder content = new StringBuilder();

for (int i = 0; i < arr.length; i++) {

content.append(arr[i]);

}

MessageDigest md = null;

String tmpStr = null;

try {

md = MessageDigest.getInstance("SHA-1");

// 将三个参数字符串拼接成一个字符串进行SHA1加密

byte[] digest = md.digest(content.toString().
getBytes());

tmpStr = byteToStr(digest);

}

catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

content = null;

// 将SHA1加密后的字符串可与Signature对比, 标识
该请求来源于微信

return tmpStr != null ? tmpStr.equals (signature.
toUpperCase()) : false;

}

3 结 语

系统在2014年7月末推出测试版, 9月3日正式上线。正式版推出7天内, 该功能的推广消息被微信用户阅读和转发约1 200次, 占微信认证用户的32%。截至10月20日, 共为425位读者提供了760次登录服务。

图书馆可以利用二维码为读者提供多样化服务, 除微信二维码登录, 还可将二维码与线下服务相结合, 如二维码读者证、二维码自助借书等。读者借书时不需要携带借书证, 只需轻松扫描二维码, 这不仅可以方便读者, 更好地保护读者个人隐私, 还能提升图书馆移动服务能力, 为读者提供更好的服务。

参考文献
[1] 百度百科. 微信二维码[EB/OL]. [2014-07-10]. http: //baike. baidu. com/view/7443374. htm?fr=aladdin.
( Baidu Baike. WeChat Two-dimension Code [EB/OL]. [2014-07-10]. http://baike.baidu.com/view/7443374.htm?fr=aladdin [本文引用:1]
[2] TUM University Library [EB/OL]. [2015-05-18]. http://www.ub.tum.de/en/online-catalogue. [本文引用:1]
[3] 南京大学图书馆[EB/OL]. [2015-05-18] http: //lib. nju. edu. cn/html/index. html.
( Nanjing University Library [EB/OL]. [2015-05-18] http://lib.nju.edu.cn/html/index.html [本文引用:1]
[4] W3C. Hypertext Transfer Protocol —— HTTP/1. 1 [EB/OL]. [2004-09-01]. http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html. [本文引用:1]
[5] 腾讯. 微信公众平台开发者文档[EB/OL]. [2013-10-29]. http: //mp. weixin. qq. com/wiki/index. php?title=生成带参数的二维码.
( Tencent. WeChat PlatForm Doc [EB/OL]. [2013- 10-29]. http://mp.weixin.qq.com/wiki/index.php?title=生成带参数的二维码 [本文引用:1]