1. 程式人生 > 其它 >01. pigx微信小程式登入流程

01. pigx微信小程式登入流程

01. pigx微信小程式登入流程

pigx配置小程式資訊

訪問pigx配置小程式資訊,在這個頁面中我們配置了pigx小程式的appIdappSecret

然後根據文件的說明,會經歷以下幾個步驟

  1. 小程式端wx.login返回 code 呼叫 pigx 獲取 token。
  2. 若 pigx 返回200 & access_token,小程式端儲存access_token,呼叫服務端API使用
  3. 若 pigx 返回401則未繫結,跳轉繫結功能
    1. 使用簡訊驗證碼模式登入獲取 token
    2. 小程式端再次wx.login獲取 code
    3. 呼叫繫結介面,實現使用者&&openid 繫結

pigx流程一覽

根據上面的步驟,一共有四個介面會進行呼叫

  1. 小程式端呼叫wx.login返回 code,呼叫http://pigx.com/auth/mobile/token/social?grant_type=mobile&mobile=MINI@{微信返回的code}獲取 token
  2. 如果手機號和 openid 進行過繫結,則可以正常獲取到 token,然後使用者就能用token來做後續的事情了。如果手機號和 openid 沒有繫結過,則呼叫http://pigx.com/admin/mobile/{手機號碼}獲取簡訊驗證碼
  3. 根據簡訊驗證碼,呼叫http://pigx.com/auth/mobile/token/sms?mobile=SMS@{手機號碼}&code={簡訊驗證碼}&grant_type=mobile
    ,獲取token
  4. 使用獲取的token,呼叫http://pigx.com/admin/social/bind?state=MINI&code={微信返回的code},將token與code進行繫結

/mobile/token/social 流程

首先,因為url是以/auth開頭,所以該請求會被閘道器pigx-gateway模組傳送到pigx-auth模組

然後該請求會被com.pig4cloud.pigx.common.security.mobile.MobileAuthenticationFilter攔截,因為這個過濾器監聽了/mobile/token/*,這個過濾器取出了MINI@{微信返回的code}

,並將這個塞入到MobileAuthenticationToken裡面,然後交給認證管理器去進行認證

不知道它怎麼執行的,它來到了com.pig4cloud.pigx.common.security.mobile.MobileAuthenticationProvider#authenticate,在這個方法裡面,它沒有辦法直接處理MINI@{微信返回的code},所以它將這個傳送給upms模組,交給該模組的/social/info/{inStr}進行處理

upms模組的com.pig4cloud.pigx.admin.controller.SysSocialDetailsController#getUserInfo方法裡面,將MINI@{微信返回的code}這個串拆分成MINI{微信返回的code}這兩部分,然後用com.pig4cloud.pigx.admin.handler.AbstractLoginHandler#handle來進行處理

AbstractLoginHandler#handle方法,會從資料庫中將小程式中的app_idapp_secret取出來,然後結合{微信返回的code},呼叫微信的jscode2session獲取 openid,使用這個 openid 去使用者表裡面搜尋使用者資訊

如果查詢到使用者資訊,則將這個使用者資訊返回回com.pig4cloud.pigx.common.security.mobile.MobileAuthenticationProvider#authenticate,然後返回正確的token

如果查詢不到則給小程式返回401未認證

/mobile/{手機號碼} 流程

上一步如果使用者沒有繫結過 openid,則小程式需要將手機號碼傳送給應用

這個url是以/admin開頭的,所以這個請求會被髮送到pigx-upms模組

在這個模組的com.pig4cloud.pigx.admin.controller.MobileController#sendSmsCode方法裡面,pigx會將簡訊驗證碼傳送給小程式,小程式開啟控制檯,能夠看到相應的簡訊驗證碼資訊

這個簡訊驗證碼同時被記錄到了redis裡面,以便後續進行校驗

因為pigx暫時是測試版本的,所以它沒有傳送簡訊。實際生產環境是不能把簡訊驗證碼返回給小程式,而應該將簡訊驗證碼通過簡訊的方式傳送給使用者

/mobile/token/sms 流程

得到簡訊驗證碼之後,小程式端請求該介面,將手機號碼和openid進行繫結

因為請求的是以/auth開頭的,所以這個請求會被髮送到pigx-auth模組

/mobile/token/social相似,這個請求也會被MobileAuthenticationFilter攔截,然後進入到com.pig4cloud.pigx.common.security.mobile.MobileAuthenticationProvider#authenticate

MobileAuthenticationProvider裡面,驗證碼也會通過feign傳送到pigx-upms模組裡面,然後驗證
手機驗證碼是否正確,正確的話返回token給小程式

/social/bind 流程

前面已經獲取到token了,然後呼叫pigx-upms模組裡面的com.pig4cloud.pigx.admin.controller.SysSocialDetailsController#bindSocial方法

在這個方法裡面,首先會呼叫identify驗證微信返回的code是否正確,如果正確的話能夠獲取到openid,然後將這個openid寫入到已登入使用者的賬號裡面

至此完成小程式繫結功能

以後小程式端再進行登入的時候,因為openid已經繫結過了,所以可以通過openid查出這個使用者,將使用者資訊對應的token返回給小程式