gtoken替換jwt實現sso登錄的排雷避坑
前言
前段時間整理的文章:gtoken替換jwt實現sso登錄 | 帶你讀源碼 收到瞭大傢積極的反饋,gtoken替換jwt實現sso登錄的開發過程是比較穩健的,但是在我們測試聯調的過程中暴露出瞭很多問題。
如果大傢也想使用gtoken替換jwt實現sso登錄,那麼這篇文章可以減少很多大傢debug的時間,分享一下我的踩坑之旅。
gtoken
服務端出於優化項目體驗的考慮,替換瞭之前校驗登錄狀態的方式,由JWT替換為 Gtoken。
gtoken替換jwt解決的問題
- 有效的避免瞭jwt服務端無法退出問題;
- 解決jwt無法作廢已頒佈的令牌,隻能等到令牌過期問題;
- 通過用戶擴展信息存儲在服務端,有效規避瞭jwt攜帶大量用戶擴展信息導致降低傳輸效率問題;
兼容JWT
gtoken替換jwt實現sso登錄在前後端通信上是能做到兼容JWT的。
我們服務端的替換操作對前端同學應該是無感的,因為後端做瞭兼容處理,不需要前端同學修改任何東西。
gtoken實現原理
gtoken的實現原理以及如何使用建議大傢讀我這篇文章: gtoken替換jwt實現sso登錄 | 帶你讀源碼。
在本篇文章中就不贅述瞭,下面重點介紹踩坑之旅:
踩坑之旅
當大傢遇到登錄問題時可以從這幾個方向定位問題:
1 gtoken版本
如果我們使用的版本是gf1.x.x,隻能使用gtokenv1.4.X相關版本。
而gtoken v1.5.0
版本全面適配GoFrame v2.0.0。
如果遇到版本不一致的問題,比如提示這種:
可以通過指定gtoken版本解決,比如這樣:
go get github.com/goflyfox/[email protected]
如果我們是團隊多人協作,碰到需要指定依賴版本的問題,我們可以考慮把go.mod提交到git中。
在遇到這個問題之前,我的習慣是把go.mod添加的gitignore中。
大傢有沒有更好的辦法來解決需要指定依賴版本的問題呢
2 gtoken存儲問題
如果你們的項目是集群應用,gtoken的存儲就需要使用gredis模式,而不是單機的gcache模式瞭。
這就需要我們生成token和獲取token的各個項目連接的redis是一致的。
如果你是集群應用,千萬要確保涉及到gtoken生成和驗證的各個項目連接的redis是一致的。
所以,大傢遇到token校驗不通過時,可以首先排查一下配置文件,是不是連接redis庫的問題。
3 不能跨環境使用token
正如上面提到的,如果gtoken的存儲是使用redis中來實現集群項目的共享。
那我們是不能跨環境使用token的,因為我們的本機、開發、測試、預發佈、生產等環境往往連接的是不同的redis。
4 測試賬號不規范問題
如果測試時多個用戶登錄同一個賬號,可能會出現奇葩問題。
究其原因是這樣的:
gtoken是允許多點登錄的,所以支持大傢使用同一個賬號登錄。
但是!如果其中一個人做瞭退出登錄的操作,那麼其他人的登錄態也會失效,需要重新登錄。
比如設置的token有效期是2個小時,且2小時內有請求操作,會刷新token的有效期。但是如果有多人登錄同一個賬號,其中一個人退出,那麼其他人的登錄態也會失效的。
總結
- gtoken版本問題
- 連接的redis庫不一致問題
- 是否跨環境使用瞭token,導致校驗不過的問題
- 多人登錄同一個賬號,有退出操作,導致登錄態失效的問題
上面這些是我在開發中踩的坑,大傢如果在集成gtoken時遇到登錄態問題可以從這幾個角度排查問題,更多關於gtoken替換jwt登錄sso避坑的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- gtoken替換jwt實現sso登錄的問題小結
- GoFrame框架gredis優雅的取值和類型轉換
- .gitignore文件作用及使用方法詳解
- GoFrame框架gset使用對比PHP Java Redis優勢
- 淺談Redis處理接口冪等性的兩種方案