圖片來(lái)自于微信小程序文檔
微信小程序的身份認(rèn)證不同于用戶(hù)名+密碼換取token類(lèi)型的身份認(rèn)證,因?yàn)樾〕绦蚴沁\(yùn)行在微信之上的,用戶(hù)信息在微信服務(wù)器,以下說(shuō)明開(kāi)發(fā)者如何針對(duì)小程序用戶(hù)做身份認(rèn)證.
如果你的小程序時(shí)動(dòng)態(tài)的,需要和后臺(tái)做數(shù)據(jù)交互,那么你需要在小程序啟動(dòng)時(shí)調(diào)用wx.login()方法,該方法會(huì)從微信服務(wù)器獲取一個(gè)code,然后將這個(gè)code發(fā)送至開(kāi)發(fā)者服務(wù)器,在第三方開(kāi)發(fā)者服務(wù)器中利用code再?gòu)奈⑿欧?wù)器獲取一個(gè)密鑰(session_key)和用戶(hù)唯一標(biāo)識(shí)(openid).
如果第三方服務(wù)器有了用戶(hù)唯一標(biāo)識(shí),那么開(kāi)發(fā)者就知道某個(gè)請(qǐng)求來(lái)自于哪個(gè)用戶(hù),從而針對(duì)該用戶(hù)做數(shù)據(jù)的增刪改查等.
現(xiàn)在有了openid,你不能直接將明文發(fā)送給客戶(hù)端,明文直接在網(wǎng)絡(luò)上傳輸有安全風(fēng)險(xiǎn),我們需要將它加密生成3rd_session,這個(gè)密鑰(session_key)就是用來(lái)給openid加密用的,注意這個(gè)3rd_session應(yīng)該是可以解密的,因?yàn)?rd_session發(fā)送給客戶(hù)端,客戶(hù)端在請(qǐng)求數(shù)據(jù)時(shí)需要將這個(gè)3rd_session放在請(qǐng)求頭中發(fā)送給開(kāi)發(fā)者服務(wù)器作為身份憑證,開(kāi)發(fā)者將其解密得到openid.
以下給出Python的加密解密模塊cryptography的使用方法,這大概是我知道的使用起來(lái)最簡(jiǎn)單的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
以上代碼沒(méi)有用session_key作為key來(lái)加密openid,直接用generate_key()方法生成一個(gè)
key,注意這個(gè)key也應(yīng)該保存下來(lái),因?yàn)榻饷軙r(shí)需要加密時(shí)的key.
def get_openid_from_encrypted_data(self, encrypted_data, key):
cipher = Fernet(key)
raw_data = cipher.decrypt(encrypted_data)
return raw_data