01. pigx微信小程序登錄流程
pigx配置小程序信息
訪問pigx配置小程序信息,在這個頁面中我們配置了pigx小程序的appId
和appSecret
。
然后根據文檔的說明,會經歷以下幾個步驟
- 小程序端
wx.login
返回 code 調用 pigx 獲取 token。 - 若 pigx 返回
200 & access_token
,小程序端保存access_token
,調用服務端API使用 - 若 pigx 返回
401
則未綁定,跳轉綁定功能- 使用短信驗證碼模式登錄獲取 token
- 小程序端再次
wx.login
獲取 code - 調用綁定接口,實現用戶&&openid 綁定
pigx流程一覽
根據上面的步驟,一共有四個接口會進行調用
- 小程序端調用
wx.login
返回 code,調用http://pigx.com/auth/mobile/token/social?grant_type=mobile&mobile=MINI@{微信返回的code}
獲取 token - 如果手機號和 openid 進行過綁定,則可以正常獲取到 token,然后用戶就能用token來做后續的事情了。如果手機號和 openid 沒有綁定過,則調用
http://pigx.com/admin/mobile/{手機號碼}
獲取短信驗證碼 - 根據短信驗證碼,調用
http://pigx.com/auth/mobile/token/sms?mobile=SMS@{手機號碼}&code={短信驗證碼}&grant_type=mobile
,獲取token - 使用獲取的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_id
和app_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返回給小程序