01. pigx微信小程式登入流程
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,呼叫
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返回給小程式