小程序登錄和登錄狀態維護
1.客戶端調用 wx.login() ,得到返回參數 code
2.客戶端調用 wx.request() 將 code 發送到服務器
3.服務器將 code 和存儲在服務器的 appid 和 appSecret 共三個參數做爲請求參數加入URL,向下面的微信服務器接口發起請求:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_codephp
服務器會得到返回參數 openid 和 session_key 。這兩個數據主要用在支付,數據簽名,數據解密等與用戶登錄態和標識有關的邏輯中。
openid是用戶惟一標識,但不建議直接用作後端服務器的各用戶標示符。java
session_key 是針對用戶數據進行加密簽名的密匙。session_key在文件校驗,獲取用戶具體信息時均需使用python
通常爲了安全起見,這兩個數據都不會發往客戶端。算法
4.服務器應使用 openid 和 session_key 生成 3rd_session ,做爲服務器派發給用戶的登錄態標識token,用於用戶的權限和數據管理。將其發送到小程序客戶端。
5.小程序客戶端將 3rd_session 存入 storage中。
6.後續用戶進入小程序時,首先調用 wx.checkSession() 檢測登錄態,若是失敗,從新發起登錄流程。
ps.微信文檔中說明使用 wx.checkSession() 來進行用戶登錄態的時間管理,使開發者無需再開發用戶登錄態時間管理邏輯,但實際開發中,wx.checkSession存在延遲,致使用戶剛進入小程序時比較卡,因此建議開發者仍然本身去處理用戶的登錄態過時時間管理,根據用戶的token來使用相關邏輯進行處理。數據庫
7.若是檢測用戶登錄狀態未失效,則從 storage 中讀取 3rd_session。在須要用戶標識的 wx.request() 時做爲用戶標識發送到服務器檢驗,服務器判斷其是否合法。
ps.在生成 3rd_session 時,將 3rd_session 做爲鍵,將 session_key + openid 做爲值,存儲在 服務器的 session 存儲或數據庫中。每一個3rd_session都須要設置一個失效時間用來進行用戶登錄態管理。小程序
獲取用戶信息
微信官方禁止無必要的獲取用戶信息,尤爲是在用戶剛進入小程序時。開發者最好在須要時再調用接口獲取用戶信息,保證小程序的審覈經過。
獲取用戶信息主要有如下要點:後端
根據微信請求用戶信息接口wx.getUserinfo()函數的請求參數withCredentials的布爾值及用戶的登錄狀態不一樣,會有不一樣的返回值。
1.當withCredentials 爲 true 且 用戶登錄態未到期api
返回的數據會包括 encryptedData,iv等敏感數據。安全
請求用戶信息返回數據項以下:服務器
- userinfo 不包含敏感數據的用戶信息
- rawData 不包含敏感數據的原始數據字符串,用於簽名校驗
- signature。 使用sha1( rawData + sessionkey ) 獲得的字符串,用於簽名校驗數據
- encryptedData 包含 openId,unionId 等用戶敏感數據的加密數據
- iv 加密算法的初始向量
2.當withCredentials 爲 false 時
不要求登錄狀態,返回數據不包含敏感數據,只包含用戶的基本信息 userinfo 和 校驗數據的rowData。
小程序的數據簽名校驗和數據解密
順便提一下小程序的簽名校驗和數據解密
簽名校驗(用於校驗數據完整性等):
須要使用session_key。客戶端將 signature 和 rawData 發送到服務器,服務器經過相同的 sha1( rewData + session_key) 算法計算出 signature2,並與客戶端發送過來的signature對比,校驗數據完整性。
加密數據encryptedData的解密:
須要客戶端將接口返回的encryptedData發送到服務器,服務器使用 appId 和 session_key ,根據加密算法的初始向量 iv 對 encryptedData 進行解密(微信提供有後端解密代碼,包括python,php等(無java)