吳 龍 鄧曉暉
(廣東省人民醫(yī)院 廣州 510000)
隨著醫(yī)院管理不斷完善及醫(yī)療信息化不斷發(fā)展,醫(yī)院內(nèi)部產(chǎn)生大量??茦I(yè)務(wù)系統(tǒng)及行政辦公系統(tǒng),醫(yī)院工作具有特殊性,需要及時響應(yīng)處理,但受限于辦公地點、網(wǎng)絡(luò)及客戶端,很多工作必須在院內(nèi)完成,為了方便辦公,各臨床及行政科室提出在家或移動辦公需求[1]。實現(xiàn)移動辦公常見的方法是開發(fā)對應(yīng)的??葡到y(tǒng)APP應(yīng)用,但開發(fā)成本較高,周期較長,且推廣困難。為更好地滿足移動辦公需求,設(shè)計院內(nèi)業(yè)務(wù)輕應(yīng)用開發(fā)平臺。平臺使用企業(yè)微信第3方應(yīng)用平臺作為應(yīng)用入口[2],通過H5、PHP及MySQL技術(shù)進(jìn)行開發(fā),所有應(yīng)用前臺展示使用微信官方發(fā)布的WEUI框架,后臺數(shù)據(jù)提交及接口設(shè)計均使用thinkPHP框架進(jìn)行開發(fā)。在實現(xiàn)院內(nèi)人力資源系統(tǒng)和企業(yè)微信通訊錄實時同步的基礎(chǔ)上,使用企業(yè)微信通訊錄對人員進(jìn)行統(tǒng)一管理。利用企業(yè)微信應(yīng)用程序接口(Application Programming Interface,API)進(jìn)行不同應(yīng)用登錄驗證,用戶只需登錄企業(yè)微信,無需記住不同應(yīng)用的用戶名和密碼就可以訪問。本文介紹基于企業(yè)微信的醫(yī)院業(yè)務(wù)輕應(yīng)用平臺,通過企業(yè)微信在移動端建立員工與醫(yī)院內(nèi)部系統(tǒng)之間的訪問,具有較強的保密性以及分級授權(quán)的管理優(yōu)勢,以一種安全、有效、經(jīng)濟的方式滿足院內(nèi)不同科室移動辦公需求。
為保證網(wǎng)絡(luò)安全,在醫(yī)院內(nèi)外網(wǎng)隔離的情況下實現(xiàn)移動辦公,平臺使用網(wǎng)閘設(shè)備,將Web應(yīng)用的實際網(wǎng)址進(jìn)行偽裝,通過與醫(yī)院官網(wǎng)域名相結(jié)合的方式,實現(xiàn)在企業(yè)微信中訪問院內(nèi)系統(tǒng)網(wǎng)絡(luò)。整個網(wǎng)絡(luò)設(shè)計,見圖1。
圖1 輕應(yīng)用平臺網(wǎng)絡(luò)設(shè)計
修改院內(nèi)輕應(yīng)用開發(fā)服務(wù)器Web訪問的80端口,將修改后的IP地址及端口(如192.168.x.x:8088)通過網(wǎng)閘信息擺渡映射到新端口中(如172.20.x.x:2019),利用網(wǎng)關(guān)設(shè)備將新網(wǎng)址綁定到醫(yī)院域名中,生成新的公網(wǎng)訪問地址(如https://nyfy.x.x:2019)。在企業(yè)微信第3方自建應(yīng)用入口地址中配置新生成的公網(wǎng)訪問地址,醫(yī)院辦公人員可以通過企業(yè)微信作為入口訪問院內(nèi)輕應(yīng)用平臺。
2.2.1 獲取調(diào)用憑證流程 企業(yè)微信用戶在進(jìn)入平臺前需要進(jìn)行身份認(rèn)證,認(rèn)證前均需要調(diào)用企業(yè)微信官方接口獲取調(diào)用憑證。具體流程為:用戶訪問第3方服務(wù),第3方服務(wù)通過構(gòu)造OAuth2鏈接(參數(shù)包括當(dāng)前第3方服務(wù)身份ID以及重定向URI),將用戶引導(dǎo)到認(rèn)證服務(wù)器的授權(quán)頁;用戶選擇是否同意授權(quán);若用戶同意授權(quán)則認(rèn)證服務(wù)器將用戶重定向到第1步指定的重定向URI,同時附上一個授權(quán)碼;第3方服務(wù)收到授權(quán)碼,附上授權(quán)碼來源的重定向URI,向認(rèn)證服務(wù)器申請憑證;認(rèn)證服務(wù)器檢查授權(quán)碼和重定向URI有效性,通過后頒發(fā)調(diào)用憑證。具體流程,見圖2。
圖2 企業(yè)微信OAuth2流程
2.2.2 身份驗證方式 得到調(diào)用憑證后可以獲取企業(yè)微信用戶基礎(chǔ)信息,從而對當(dāng)前用戶進(jìn)行身份驗證,常見身份驗證方式有兩種:第1種是將企業(yè)微信用戶唯一標(biāo)識userID和輕應(yīng)用平臺中用戶身份進(jìn)行綁定,進(jìn)入平臺內(nèi)應(yīng)用前需先調(diào)用接口獲取當(dāng)前用戶userID(必須使用企業(yè)微信客戶端),與平臺內(nèi)用戶信息綁定的userID對比驗證確認(rèn)后獲取用戶身份;第2種是在企業(yè)微信中增加員工身份信息,如工號、身份證號等,通過先獲取身份信息再進(jìn)行二次驗證的方法實現(xiàn)登錄驗證。相較于第1種方法,第2種方法無需在輕應(yīng)用平臺中對用戶企業(yè)微信userID和平臺內(nèi)用戶ID進(jìn)行綁定。企業(yè)微信為用戶提供豐富的功能接口,開發(fā)人員可以調(diào)用公共接口在網(wǎng)頁中實現(xiàn)在APP中才可以實現(xiàn)的功能,如掃碼、讀取文件、使用WiFi、藍(lán)牙、定位等功能[3-4]。
2.3.1 數(shù)據(jù)加密 完成身份認(rèn)證登錄后可以使用企業(yè)微信內(nèi)置瀏覽器訪問院內(nèi)系統(tǒng),但存在數(shù)據(jù)泄露風(fēng)險,因此在數(shù)據(jù)提交和查詢前需要對數(shù)據(jù)進(jìn)行加密處理。常見的數(shù)據(jù)加密方式有:非對稱加密(RSA),會產(chǎn)生公鑰和私鑰,公鑰在客戶端,私鑰在服務(wù)端,公鑰用于加密,私鑰用于解密;對稱加密(AES),直接使用給定的秘鑰加密或解密;一種單向的加密方式(MD5),只能加密,不能解密;Base64編碼,對字節(jié)數(shù)組轉(zhuǎn)換成字符串的一種編碼方式。一般情況下未加密前數(shù)據(jù)是以明文方式傳輸,客戶端將要上傳的數(shù)據(jù)打包,通過Post方式提交給服務(wù)器。服務(wù)器接收提交的數(shù)據(jù)包,獲取客戶端提交的值,進(jìn)行處理。處理結(jié)束將數(shù)據(jù)打包,返回給客戶端處理。
2.3.2 平臺數(shù)據(jù)傳輸 客戶端上傳數(shù)據(jù)加密——服務(wù)器獲取數(shù)據(jù)解密——服務(wù)器返回數(shù)據(jù)加密——客戶端獲取數(shù)據(jù)解密。如客戶端上傳數(shù)據(jù)加密 A需要客戶端隨機產(chǎn)生一個16位字符串,用于AES加密的秘鑰,即AESKey。使用RSA對AESKey進(jìn)行公鑰加密,即RSAKey。將需要上傳的明文數(shù)據(jù)包轉(zhuǎn)為Json字符串,通過AESKey加密,得到JsonAESEncryptedData。封裝為{key: RSAKey, value: JsonAESEncryptedData}的數(shù)據(jù)串上傳服務(wù)器,服務(wù)器只需要通過key和value,即可解析獲取數(shù)據(jù)。
2.3.3 數(shù)據(jù)解密 獲取RSAKey后用服務(wù)器私鑰解密,得到AESKey,獲取到JsonAESEncriptedData,使用AESKey解密,得到客戶端上傳的明文數(shù)據(jù)。完成服務(wù)器端的數(shù)據(jù)處理后返回數(shù)據(jù)加密 C,具體流程是將要返回給客戶端的數(shù)據(jù)轉(zhuǎn)成Json字符串,用AESKey加密處理,封裝數(shù)據(jù){data: value}的形式返回給客戶端??蛻舳双@取數(shù)據(jù)解密 D,流程為:客戶端獲取數(shù)據(jù)后通過key為data得到服務(wù)器返回的已加密的數(shù)據(jù)AESEncryptedResponseData,使用AESKey進(jìn)行解密,得到明文服務(wù)器返回的數(shù)據(jù)[5]。具體加解密流程,見圖3。
圖3 數(shù)據(jù)加密解密流程
2.3.4 數(shù)據(jù)簽名 經(jīng)過以上處理后數(shù)據(jù)通信已具備很高安全性,但仍有一定風(fēng)險,平臺在數(shù)據(jù)通信中增加數(shù)據(jù)簽名步驟。數(shù)據(jù)簽名是為防止偽造數(shù)據(jù)的一種手段,在接口調(diào)用過程中使用較為廣泛。其原理是通信雙方約定好彼此的密匙,訪問方將要提交的數(shù)據(jù)經(jīng)過一系列操作處理,如排序、非對稱加密等,生成簽名,訪問攜帶簽名信息,響應(yīng)方獲取請求數(shù)據(jù)后,根據(jù)同樣方法和密匙生成同樣簽名,經(jīng)對比若簽名信息一致則認(rèn)可為合法數(shù)據(jù),不一致則為非法數(shù)據(jù)。數(shù)據(jù)簽名具體流程如下:訪問方分配私鑰為abCfa,假設(shè)接口包含以下參數(shù)no=20190899;name=test;phone=13800138000;cno=k239494;則按照如下方式生成加密字符串 signature,將參數(shù)名稱按照ASCII升序排序,結(jié)果為cno,name,no,phone,依次從排序中取出參數(shù)名稱,將對應(yīng)的值串聯(lián)起來,結(jié)果如下(signature不參與簽名):例如cno=k239494&name=test&no=20190899&phone=13800138000,串聯(lián)私鑰abCfa得到一個新的字符串:no=k239494&name=test&no=20190899&phone=13800138000&key=abCfa,調(diào)用MD5加密算法對新字符串進(jìn)行加密得到signature值,加密后的結(jié)果為:1e0eaf80ea6dd39a188c4624aa 547fa3,使用時將生成的signature作為參數(shù)一起上傳,相應(yīng)方需使用同樣方法和私鑰,生成相同簽名signature1,與提交的signature進(jìn)行對比,雙方一致后驗簽成功。數(shù)據(jù)加密與加簽兩種方法相結(jié)合可以極大提高數(shù)據(jù)通信安全性,但這種方法也存在一定弊端,當(dāng)服務(wù)器配置較低且系統(tǒng)并發(fā)較高時,以上加密方式會增加服務(wù)器負(fù)擔(dān),降低服務(wù)器性能,造成系統(tǒng)響應(yīng)緩慢,數(shù)據(jù)提交滯后等,因此平臺設(shè)計另一套方案,數(shù)據(jù)提交時只進(jìn)行對稱加密并在數(shù)據(jù)中增加簽名,一定程度上降低通信安全性,但綜合性能得到提升。
利用企業(yè)微信API將需要發(fā)送的消息推送給企業(yè)微信中對應(yīng)的應(yīng)用中指定用戶,目前企業(yè)微信限制為每個應(yīng)用中每個用戶每天最多可接收30條消息[6],能滿足日常辦公需要。消息推送分為單發(fā)和群發(fā)模式,單發(fā)模式是發(fā)送給指定人員,群發(fā)則可以發(fā)送至指定分組內(nèi)的所有人,具體推送流程,見圖4。
圖4 企業(yè)微信消息推送時序
平臺前臺頁面均使用WEUI框架開發(fā),通過已有組件進(jìn)行布局和排版,后臺數(shù)據(jù)流、接口及邏輯處理利用thinkPHP5.0框架,平臺中應(yīng)用一部分是針對原有應(yīng)用做了輕量級定制化開發(fā),一部分為原創(chuàng)開發(fā),所有應(yīng)用都是只做簡單的數(shù)據(jù)收集和展示及一些應(yīng)急操作,復(fù)雜的邏輯功能均保留到院內(nèi)系統(tǒng)中使用。目前平臺已在院內(nèi)穩(wěn)定運行兩年,且投入使用多個系統(tǒng)。
該應(yīng)用在院內(nèi)消防安全上報系統(tǒng)的基礎(chǔ)上進(jìn)行簡單的功能遷移,包括消防安全信息上報、?;肥褂蒙蠄蠹跋姥矙z。
該應(yīng)用是院內(nèi)醫(yī)務(wù)人員檔案系統(tǒng)部分功能遷移,主要包括醫(yī)務(wù)人員基本信息填寫、基本檔案上報(包含個人獲獎、證書、培訓(xùn)考核、學(xué)會任職信息)及醫(yī)療技術(shù)授權(quán)查詢等,針對原應(yīng)用做了定制開發(fā)。
平臺原創(chuàng)應(yīng)用,主要功能包括對心臟外科監(jiān)護(hù)室患者進(jìn)行床旁譫妄評估,將評估結(jié)果對接到醫(yī)院信息系統(tǒng)中,供醫(yī)護(hù)人員參考使用??赏ㄟ^手工錄入病案號或掃描患者腕帶的方式錄入患者身份信息,獲取病案號后調(diào)用醫(yī)院信息系統(tǒng)中患者基本信息接口,獲取其他基本信息,信息收集完整后建檔并開始評估。
在原會議簽到系統(tǒng)基礎(chǔ)上,將簽到APP掃碼簽到功能進(jìn)行遷移,增加個人學(xué)分及會議查詢功能。
搭建院內(nèi)輕應(yīng)用開發(fā)平臺,基于輕應(yīng)用平臺對院內(nèi)部分業(yè)務(wù)進(jìn)行定制化輕應(yīng)用開發(fā),利用企業(yè)微信第3方應(yīng)用平臺實現(xiàn)院內(nèi)業(yè)務(wù)的移動辦公,經(jīng)過兩年持續(xù)改進(jìn)和運行,切實解決臨床和行政工作中消息傳遞和辦公不及時的問題。輕應(yīng)用平臺的建設(shè)為全體員工帶來便利,同時為今后院內(nèi)業(yè)務(wù)移動化、輕量化定制開發(fā)提供基礎(chǔ)框架,對醫(yī)院信息化建設(shè)和發(fā)展具有重大意義。