1. 程式人生 > >基於gin框架和jwt-go中間件實現小程序用戶登陸和token驗證

基於gin框架和jwt-go中間件實現小程序用戶登陸和token驗證

expires 微信 處理 如果 .net local 切入點 小程序 err

本文核心內容是利用jwt-go中間件來開發golang webapi用戶登陸模塊的token下發和驗證,小程序登陸功能只是一個切入點,這套邏輯同樣適用於其他客戶端的登陸處理。

小程序登陸邏輯

小程序的登陸邏輯在其他博主的文章中已經總結得非常詳盡,比如我參考的是這篇博文:微信小程序登錄邏輯整理,所以在這裏不再贅述,只是大致歸納一下我的實現流程:

  1. 在小程序端調用wx.login方法,異步獲得到微信下發的 jscode ,然後將 jscode 發送到 golang 服務端(如果需要詳細用戶信息,見參考博文的實現邏輯,流程大致相似);

  2. 服務端接收到 jscode 後,將其與 AppID 和 AppSecret 一起按官方文檔的格式,發送到微信接口( AppID 和 AppSecret 在小程序管理平臺上進行查看),如果接口調用成功,會返回以下字段:
  • openid:用戶信息唯一識別id
  • session_key :解密用戶信息的key
  • expires_in :key的有效期
  1. 根據 open_id 去數據庫查找對應的用戶信息,如果有,獲得其平臺 uid ,否則新建用戶,返回新建信息 uid ;
  2. 將 uid 作為關鍵信息,生成 jwt 格式的 token 字符串,返回給小程序客戶端,小程序收到 token 判定登陸成功,並將 token 存入 localstorage ,以後的每次請求先讀取 localstorage 中的 token 放入請求頭部作為身份標識,如果 token 失效或者無法讀取,則重新執行登陸流程。

由於小程序段邏輯簡單,而且不是本文討論重點,代碼實現就不貼出了,後面應該也不會再補。

服務端處理流程

服務端實現是本文的重頭戲,由於 golang 語言的特性,我在實際開發中也踩了一些不大不小的坑,在這裏進行詳細記錄,也作為一個經驗總結,同時加深印象。服務端流程可以大致分為以下幾個大步驟:

  1. 根據客戶端發送的 jscode 獲得用戶 open_id

  2. 利用 open_id 獲取平臺 uid ,同時使用 jwt-go 中間件實現 token 的生成

  3. 封裝 token 驗證中間件,判斷請求是否合法

本文的代碼實現是在gin 框架基礎上完成的,gin是一個非常輕量的 web http 處理框架,很符合 golang 輕框架的理念,但高度靈活也要求了一定的自主開發能力,比如請求數據庫讀寫、請求信息讀取和一些中間件的使用,這些都需要自己查找不同包的官方文檔,去檢索Api和查找對應的解決方案。雖然如此,但作為習慣了 .net平臺 高度封裝和甜到發膩的語法糖的 .neter ,在 golang 開發過程中也體會到了不一樣的樂趣。廢話不多說,如果對 golang 開發感興趣的話,gin

是一個我十分推薦的上手框架。

獲得用戶 open_id

在這裏簡單介紹一下路由、model和controller的一個分層開發實現:

  • main.go 程序入口,在這裏進行路由分發
  • controllers/xx.go xx模塊的路由請求處理代碼相關
  • models/xx.go xx模塊用到的結構體 struct (類似class)定和結構體相關函數定義
  • middleware 存放封裝後的請求處理中間件

首先,按照gin框架的基礎路由處理,調用AccountController中的WxLogin函數,接受處理/account/login路由的 GET 請求。

//main.go
...
func main(){
    r := gin.Default()
    account := new(controllers.AccountController)
    r.GET("/account/login", account.WxLogin)
}

然後在AccountController.go中先讀取 jscode ,再將 jscode 和其他信息一起發送給微信服務器,獲得官方返回的核心字段。

//controllers/AccountController.go
...
func (ctrl AccountController) WxLogin(c *gin.Context) {
     jscode := c.Query("jsCode")
    //發送jscode,獲得用戶的open_id
    wxSession, err := accountModel.WxLogin(jscode)
    ...
}

未完待續

基於gin框架和jwt-go中間件實現小程序用戶登陸和token驗證