一、背景
傳統的web
開發實現登陸功能,一般的做法是輸入賬號密碼、或者輸入手機號及簡訊驗證碼進行登入
服務端校驗使用者資訊通過之後,下發一個代表登入態的 token
給客戶端,以便進行後續的互動,每當token
過期,使用者都需要重新登入
而在微信小程式中,可以通過微信官方提供的登入能力方便地獲取微信提供的使用者身份標識,快速建立小程式內的使用者體系,從而實現登陸功能
實現小程式使用者體系主要涉及到openid
和code
的概念:
- 呼叫
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,流程如下所示:
參考文獻
- https://segmentfault.com/a/1190000016750340