首頁 > 軟體

gtoken替換jwt實現sso登入的排雷避坑

2022-06-11 18:00:43

前言

前段時間整理的文章: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/gtoken@v1.4.1

如果我們是團隊多人共同作業,碰到需要指定依賴版本的問題,我們可以考慮把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避坑的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com