圖片來自于微信小程序文檔
微信小程序的身份認證不同于用戶名+密碼換取token類型的身份認證,因為小程序是運行在微信之上的,用戶信息在微信服務器,以下說明開發者如何針對小程序用戶做身份認證.
如果你的小程序時動態的,需要和后臺做數據交互,那么你需要在小程序啟動時調用wx.login()方法,該方法會從微信服務器獲取一個code,然后將這個code發送至開發者服務器,在第三方開發者服務器中利用code再從微信服務器獲取一個密鑰(session_key)和用戶唯一標識(openid).
如果第三方服務器有了用戶唯一標識,那么開發者就知道某個請求來自于哪個用戶,從而針對該用戶做數據的增刪改查等.
現在有了openid,你不能直接將明文發送給客戶端,明文直接在網絡上傳輸有安全風險,我們需要將它加密生成3rd_session,這個密鑰(session_key)就是用來給openid加密用的,注意這個3rd_session應該是可以解密的,因為3rd_session發送給客戶端,客戶端在請求數據時需要將這個3rd_session放在請求頭中發送給開發者服務器作為身份憑證,開發者將其解密得到openid.
以下給出Python的加密解密模塊cryptography的使用方法,這大概是我知道的使用起來最簡單的Python加密解密模塊了:
-
from cryptography.fernet import Fernet
-
-
# 加密得到3rd_session
-
def get_3rd_session(self, openid):
-
key = Fernet.generate_key()
-
cipher = Fernet(key)
-
encrypted_data = cipher.encrypt(openid.encode('utf-8'))
-
return encrypted_data, key
以上代碼沒有用session_key作為key來加密openid,直接用generate_key()方法生成一個 key,注意這個key也應該保存下來,因為解密時需要加密時的key.
-
def get_openid_from_encrypted_data(self, encrypted_data, key):
-
cipher = Fernet(key)
-
raw_data = cipher.decrypt(encrypted_data)
-
return raw_data
-