面試官:說說微信小程序的登錄流程?
一、背景
傳統(tǒng)的web開發(fā)實(shí)現(xiàn)登陸功能,一般的做法是輸入賬號(hào)密碼、或者輸入手機(jī)號(hào)及短信驗(yàn)證碼進(jìn)行登錄
服務(wù)端校驗(yàn)用戶信息通過之后,下發(fā)一個(gè)代表登錄態(tài)的 token 給客戶端,以便進(jìn)行后續(xù)的交互,每當(dāng)token過期,用戶都需要重新登錄
而在微信小程序中,可以通過微信官方提供的登錄能力方便地獲取微信提供的用戶身份標(biāo)識(shí),快速建立小程序內(nèi)的用戶體系,從而實(shí)現(xiàn)登陸功能
實(shí)現(xiàn)小程序用戶體系主要涉及到openid和code的概念:
- 調(diào)用wx.login()方法會(huì)生成code,將code作為參數(shù)傳遞給微信服務(wù)器指定接口,就可以獲取用戶的openid
對(duì)于每個(gè)小程序,微信都會(huì)將用戶的微信ID映射出一個(gè)小程序 openid,作為這個(gè)用戶在這個(gè)小程序的唯一標(biāo)識(shí)
二、流程
微信小程序登陸具體實(shí)現(xiàn)的邏輯如下圖所示:
- 通過 wx.login() 獲取到用戶的code判斷用戶是否授權(quán)讀取用戶信息,調(diào)用wx.getUserInfo 讀取用戶數(shù)據(jù)
- 由于小程序后臺(tái)授權(quán)域名無法授權(quán)微信的域名,所以需要自身后端調(diào)用微信服務(wù)器獲取用戶信息
- 通過 wx.request() 方法請(qǐng)求業(yè)務(wù)方服務(wù)器,后端把 appid , appsecret 和 code 一起發(fā)送到微信服務(wù)器。appid 和 appsecret 都是微信提供的,可以在管理員后臺(tái)找到
- 微信服務(wù)器返回了 openid 及本次登錄的會(huì)話密鑰 session_key
- 后端從數(shù)據(jù)庫中查找 openid ,如果沒有查到記錄,說明該用戶沒有注冊(cè),如果有記錄,則繼續(xù)往下走
- session_key 是對(duì)用戶數(shù)據(jù)進(jìn)行加密簽名的密鑰。為了自身應(yīng)用安全,session_key 不應(yīng)該在網(wǎng)絡(luò)上傳輸
- 然后生成 session并返回給小程序
- 小程序把 session 存到 storage 里面
- 下次請(qǐng)求時(shí),先從 storage 里面讀取,然后帶給服務(wù)端
- 服務(wù)端對(duì)比 session 對(duì)應(yīng)的記錄,然后校驗(yàn)有效期
更加詳細(xì)的功能圖如下所示:
三、擴(kuò)展
實(shí)際業(yè)務(wù)中,我們還需要登錄態(tài)是否過期,通常的做法是在登錄態(tài)(臨時(shí)令牌)中保存有效期數(shù)據(jù),該有效期數(shù)據(jù)應(yīng)該在服務(wù)端校驗(yàn)登錄態(tài)時(shí)和約定的時(shí)間(如服務(wù)端本地的系統(tǒng)時(shí)間或時(shí)間服務(wù)器上的標(biāo)準(zhǔn)時(shí)間)做對(duì)比
這種方法需要將本地存儲(chǔ)的登錄態(tài)發(fā)送到小程序的服務(wù)端,服務(wù)端判斷為無效登錄態(tài)時(shí)再返回需重新執(zhí)行登錄過程的消息給小程
另一種方式可以通過調(diào)用wx.checkSession檢查微信登陸態(tài)是否過期:
如果過期,則發(fā)起完整的登錄流程
如果不過期,則繼續(xù)使用本地保存的自定義登錄態(tài)
這種方式的好處是不需要小程序服務(wù)端來參與校驗(yàn),而是在小程序端調(diào)用AP,流程如下所示:
參考文獻(xiàn)
https://segmentfault.com/a/1190000016750340
https://juejin.cn/post/6955754095860776973
https://www.cnblogs.com/zwh0910/p/13977278.html