點擊進入原地址
小程序調用wx.login得到code.
調用接口獲取登錄憑證(code)進而換取用戶登錄態信息,包括用戶的唯一標識(openid) 及本次登錄的 會(hui) 話密鑰(session_key)。用戶數據的加解密通訊需要依賴會(hui) 話密鑰完成。
小程序調用wx.getUserInfo得到rawData, signatrue, encryptData.
小程序調用server獲取token接口, 傳(chuan) 入code, rawData, signature, encryptData.
server調用微信提供的jsoncode2session接口獲取openid, session_key, 調用失敗應給予客戶端反饋, 微信側(ce) 返回錯誤則可判斷為(wei) 惡意請求, 可以不返回. 微信文檔鏈接
這是一個(ge) HTTP 接口,開發者服務器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對用戶數據進行加密簽名的密鑰。為(wei) 了自身應用安全,session_key 不應該在網絡上傳(chuan) 輸。
接口地址:"https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code"
server計算signature, 並與(yu) 小程序傳(chuan) 入的signature比較, 校驗signature的合法性, 不匹配則返回signature不匹配的錯誤. 不匹配的場景可判斷為(wei) 惡意請求, 可以不返回. 微信文檔鏈接
通過調用接口(如 wx.getUserInfo)獲取敏感數據時,接口會(hui) 同時返回 rawData、signature,其中 signature = sha1( rawData + session_key )
將 signature、rawData、以及用戶登錄態發送給開發者服務器,開發者在數據庫中找到該用戶對應的 session-key,使用相同的算法計算出簽名 signature2 ,比對 signature 與(yu) signature2 即可校驗數據的可信度。
使用第4步返回的session_key解密encryptData, 將解得的信息與(yu) rawData中信息進行比較, 需要完全匹配, 解得的信息中也包括openid, 也需要與(yu) 第4步返回的openid匹配. 解密失敗或不匹配應該返回客戶相應錯誤. 微信文檔鏈接
接口如果涉及敏感數據(如wx.getUserInfo當中的 openid ),接口的明文內(nei) 容將不包含敏感數據。開發者如需要獲取敏感數據,需要對接口返回的加密數據( encryptData )進行對稱解密。 解密算法如下:
- 對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充。
- 對稱解密的目標密文為 Base64_Decode(encryptData),
- 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節
對稱解密算法初始向量 iv = aeskey, 同樣是16字節
- rawData格式:
{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" }
- encryptData解密之後格式:
{ "openId": "OPENID", "nickName": "NICKNAME", "gender": 1, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID" }
使用session_key作為(wei) 密鑰, 加密至少包括openid, timestamp, random(隨機值), version(版本)的內(nei) 容, 得到token. 加密算法可以參考微信對encryptData的加密算法. server應該緩存session_key, 緩存的過期時間不應該小於(yu) token的過期時間. 將openid, token返回給客戶端.
小程序每次業(ye) 務請求都必須帶上openid和token, server驗證token的合法性: token能否被正常解密; 解密後的openid和傳(chuan) 入的openid是否一致; 解密後可得到token的生成時間, token是否過期. 全部校驗通過即可正常處理業(ye) 務請求.