小程序登陸和登陸狀態維護
1.客戶端調用 wx.login() ,獲得返回參數 code
2.客戶端調用 wx.request() 將 code 發送到服務器
3.服務器將 code 和存儲在服務器的 appid 和 appSecret 共三個參數作為請求參數加入URL,向下面的微信服務器接口發起請求:
服務器會獲得返回參數 openid 和 session_key 。這兩個數據主要用在支付,數據簽名,數據解密等與用戶登陸態和標識有關的邏輯中。
openid是用戶唯一標識,但不建議直接用做后端服務器的各用戶標示符。
session_key 是針對用戶數據進行加密簽名的密匙。session_key在文件校驗,獲取用戶具體信息時均需使用
一般為了安全起見,這兩個數據都不會發往客戶端。
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 且 用戶登陸態未到期
返回的數據會包括 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)