微信小程式維護登入態與獲取使用者資訊

奮鬥年輕人發表於2017-08-04

前言、

  微信小程式的執行環境不是在瀏覽器下執行的。所以不能以cookie來維護登入態。下面我就來說說我根據官方給出的方法來寫出的維護登入態的方法吧。

一、登入態維護

官方的文件地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

  通過 wx.login() 獲取到使用者登入態之後,需要維護登入態。開發者要注意不應該直接把 session_key、openid 等欄位作為使用者的標識或者 session 的標識,而應該自己派發一個 session 登入態(請參考登入時序圖)。對於開發者自己生成的 session,應該保證其安全性且不應該設定較長的過期時間。session 派發到小程式客戶端之後,可將其儲存在 storage ,用於後續通訊使用。

 

登入時序圖

 

從上圖可以看出。當我們通過wx.login()獲取code的後,傳送給我們的伺服器,然後去請求微信伺服器換取得到對應的openid與session_key,openid是該使用者在小程式中的唯一標識用於模板通知之類的。session_key就是用來解密使用者的敏感資訊。unionid之類的。unionid是微信使用者在所有微信平臺下的唯一標識。下面我會講解一下如何得到。

以上就是我的實現方法。呼叫wx.login()得到code後請求伺服器獲取openid與session_key快取在伺服器當中。其中生成一個隨機數為key,value為openid與session_key。然後返回到小程式通過wx.setStorageSync('LoginSessionKey',得到的隨機數key)快取在小程式當中。每當我們去請求伺服器時帶上LoginSessionKey即可給伺服器讀取從而判斷使用者是否在登入。是不是很簡單呢?

二、使用者資料的加解密

通過wx.login()登入之後。我們可以通過wx.getUserInfo()獲取使用者資訊。其中一些不敏感的資訊在返回的 result中的userInfo裡。如想要獲取敏感資訊。openid,unionid之類的。則需要從密文中去解密得到。

而密文則在encryptedData這個欄位當中。我們去請求我們伺服器去解密然後得到敏感資訊後則可以儲存起來。

加密資料解密演算法

介面如果涉及敏感資料(如wx.getUserInfo當中的 openId 和unionId ),介面的明文內容將不包含這些敏感資料。開發者如需要獲取敏感資料,需要對介面返回的加密資料( encryptedData )進行對稱解密。 解密演算法如下:

  1. 對稱解密使用的演算法為 AES-128-CBC,資料採用PKCS#7填充。
  2. 對稱解密的目標密文為 Base64_Decode(encryptedData),
  3. 對稱解密祕鑰 aeskey = Base64_Decode(session_key), aeskey 是16位元組
  4. 對稱解密演算法初始向量 iv 會在資料介面中返回。

微信官方提供了多種程式語言的示例程式碼(點選下載)。每種語言型別的介面名字均一致。呼叫方式可以參照示例。

 

這時候我們通過小程式得到的result.encryptedData與result.iv與後端得到的session_key 解密出我們得到的敏感使用者資訊了。

官方給出的解密文件:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

相關文章