微信小程式的登錄流程

 

 

一、背景

傳統的web開發實現登陸功能,一般的做法是輸入帳號密碼、或者輸入手機號及簡訊驗證碼進行登錄

服務端校驗用戶資訊通過之後,下發一個代表登錄態的 token 給客戶端,以便進行後續的交互,每當token過期,用戶都需要重新登錄

而在微信小程式中,可以通過微信官方提供的登錄能力方便地獲取微信提供的用戶身份標識,快速建立小程式內的用戶體系,從而實現登陸功能

實現小程式用戶體系主要涉及到openidcode的概念:

  • 調用wx.login()方法會生成code,將code作為參數傳遞給微信伺服器指定介面,就可以獲取用戶的openid

對於每個小程式,微信都會將用戶的微信ID映射出一個小程式 openid,作為這個用戶在這個小程式的唯一標識

二、流程

微信小程式登陸具體實現的邏輯如下圖所示:

 

 

  • 通過  wx.login()  獲取到用戶的code判斷用戶是否授權讀取用戶資訊,調用wx.getUserInfo 讀取用戶數據
  • 由於小程式後台授權域名無法授權微信的域名,所以需要自身後端調用微信伺服器獲取用戶資訊
  • 通過 wx.request() 方法請求業務方伺服器,後端把 appid , appsecret  和 code 一起發送到微信伺服器。appid 和 appsecret 都是微信提供的,可以在管理員後台找到
  • 微信伺服器返回了 openid 及本次登錄的會話密鑰 session_key
  • 後端從資料庫中查找 openid ,如果沒有查到記錄,說明該用戶沒有註冊,如果有記錄,則繼續往下走
  • session_key 是對用戶數據進行加密簽名的密鑰。為了自身應用安全,session_key 不應該在網路上傳輸
  • 然後生成 session並返回給小程式
  • 小程式把 session 存到  storage 裡面
  • 下次請求時,先從 storage 裡面讀取,然後帶給服務端
  • 服務端對比 session 對應的記錄,然後校驗有效期

更加詳細的功能圖如下所示:

 

 

三、擴展

實際業務中,我們還需要登錄態是否過期,通常的做法是在登錄態(臨時令牌)中保存有效期數據,該有效期數據應該在服務端校驗登錄態時和約定的時間(如服務端本地的系統時間或時間伺服器上的標準時間)做對比

這種方法需要將本地存儲的登錄態發送到小程式的服務端,服務端判斷為無效登錄態時再返回需重新執行登錄過程的消息給小程

另一種方式可以通過調用wx.checkSession檢查微信登陸態是否過期:

  • 如果過期,則發起完整的登錄流程
  • 如果不過期,則繼續使用本地保存的自定義登錄態

這種方式的好處是不需要小程式服務端來參與校驗,而是在小程式端調用AP,流程如下所示:

 

 

參考文獻

  • //segmentfault.com/a/1190000016750340
Tags: