微信小程序的運行環(huán)境不是在瀏覽器下運行的。所以不能以cookie來維護登錄態(tài)幔虏。下面我就來說說我根據官方給出的方法來寫出的維護登錄態(tài)的方法吧贝椿。
一、登錄態(tài)維護
官方的文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject
通過 wx.login()
獲取到用戶登錄態(tài)之后瑟蜈,需要維護登錄態(tài)。開發(fā)者要注意不應該直接把 session_key宪躯、openid 等字段作為用戶的標識或者 session 的標識位迂,而應該自己派發(fā)一個 session 登錄態(tài)(請參考登錄時序圖)。對于開發(fā)者自己生成的 session臣缀,應該保證其安全性且不應該設置較長的過期時間肝陪。session 派發(fā)到小程序客戶端之后刑顺,可將其存儲在 storage ,用于后續(xù)通信使用狼讨。
當我們通過wx.login()獲取code的后柒竞,發(fā)送給我們的服務器,然后去請求微信服務器換取得到對應的openid與session_key布隔,openid是該用戶在小程序中的唯一標識用于模板通知之類的稼虎。session_key就是用來解密用戶的敏感信息霎俩。unionid之類的。unionid是微信用戶在所有微信平臺下的唯一標識杉适。
以上就是我的實現(xiàn)方法猿推。調用wx.login()得到code后請求服務器獲取openid與session_key緩存在服務器當中捌肴。其中生成一個隨機數(shù)為key毯侦,value為openid與session_key侈离。然后返回到小程序通過wx.setStorageSync('LoginSessionKey',得到的隨機數(shù)key)緩存在小程序當中筝蚕。每當我們去請求服務器時帶上LoginSessionKey即可給服務器讀取從而判斷用戶是否在登錄起宽。是不是很簡單呢洲胖?
二绿映、用戶數(shù)據的加解密
通過wx.login()登錄之后腐晾。我們可以通過wx.getUserInfo()獲取用戶信息。其中一些不敏感的信息在返回的 result中的userInfo里淹冰。如想要獲取敏感信息樱拴。openid,unionid之類的。則需要從密文中去解密得到晶乔。
而密文則在[encryptedData]如果涉及敏感數(shù)據(如wx.getUserInfo
當中的 openId 和unionId )正罢,接口的明文內容將不包含這些敏感數(shù)據腺怯。開發(fā)者如需要獲取敏感數(shù)據川无,需要對接口返回的加密數(shù)據( encryptedData )進行對稱解密懦趋。 解密算法如下:
- 對稱解密使用的算法為 AES-128-CBC疹味,數(shù)據采用PKCS#7填充帜篇。
- 對稱解密的目標密文為 Base64_Decode(encryptedData),
- 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)
- 對稱解密算法初始向量 iv 會在數(shù)據接口中返回笙隙。
微信官方提供了多種編程語言的示例代碼(點擊下載)竟痰。每種語言類型的接口名字均一致。調用方式可以參照示例掏呼。
這時候我們通過小程序得到的result.encryptedData與result.iv與后端得到的session_key 解密出我們得到的敏感用戶信息了坏快。
官方給出的解密文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html