林健
摘要:本文介紹了基于微信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