最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

gtoken替換jwt實現(xiàn)sso登錄的問題小結(jié)

 更新時間:2022年05月27日 11:48:33   作者:數(shù)據(jù)猿視覺  
這篇文章主要介紹了gtoken替換jwt實現(xiàn)sso登錄,主要介紹了替換jwt的原因分析及gtoken的優(yōu)勢,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

今天和大家分享一下使用gtoken替換jwt實現(xiàn)sso登錄的經(jīng)驗,為了讓大家更好的理解會帶大家讀一下重點的源碼。

jwt的問題

首先說明一個jwt存在的問題,也就是要替換jwt的原因:

  • jwt無法在服務(wù)端主動退出的問題
  • jwt無法作廢已頒布的令牌,只能等到令牌過期問題
  • jwt攜帶大量用戶擴展信息導(dǎo)致降低傳輸效率問題

jwt的請求流程圖

gtoken的優(yōu)勢

gtoken的請求流程和jwt的基本一致。

gtoken的優(yōu)勢就是能幫助我們解決jwt的問題,另外還提供好用的特性,比如:

  1. gtoken支撐單點應(yīng)用測試使用內(nèi)存存儲,支持個人項目文件存儲,也支持企業(yè)集群使用redis存儲;完全適用于企業(yè)生產(chǎn)級使用;
  2. 有效的避免了jwt服務(wù)端無法退出問題;
  3. 解決jwt無法作廢已頒布的令牌,只能等到令牌過期問題;
  4. 通過用戶擴展信息存儲在服務(wù)端,有效規(guī)避了jwt攜帶大量用戶擴展信息導(dǎo)致降低傳輸效率問題;
  5. 有效避免jwt需要客戶端實現(xiàn)續(xù)簽功能,增加客戶端復(fù)雜度;支持服務(wù)端自動續(xù)期,客戶端不需要關(guān)心續(xù)簽邏輯;

注意問題

  • 支持服務(wù)端緩存自動續(xù)期功能,不需要通過refresh_token刷新token,簡化了客戶端的操作
  • 版本問題千萬注意:在gtoken v1.5.0全面適配GoFrame v2.0.0 ; GoFrame v1.X.X 請使用GfToken v1.4.X相關(guān)版本

TIPS:下面我的演示demo和源碼閱讀都是基于v1.4.x版本的。

演示demo

下面的演示demo可以復(fù)制到本地main.go文件中執(zhí)行,更新依賴的時候千萬注意版本。

重點說一下踩的坑:

Login方法會要求我們返回兩個值:

第一個值對應(yīng)userKey,后續(xù)我們可以根據(jù)userKey獲得token 第二個值對應(yīng)data,是interface{}類型,我們可以在這里定義例如userid、username等數(shù)據(jù)。

先有這個概念即可,后面會帶大家讀源碼。

package main
import (
   "github.com/goflyfox/gtoken/gtoken"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/net/ghttp"
   "github.com/gogf/gf/os/glog"
)
var TestServerName string
//var TestServerName string = "gtoken"
func main() {
   glog.Info("########service start...")
   g.Cfg().SetPath("example/sample")
   s := g.Server(TestServerName)
   initRouter(s)
   glog.Info("########service finish.")
   s.Run()
}
var gfToken *gtoken.GfToken
/*
統(tǒng)一路由注冊
*/
func initRouter(s *ghttp.Server) {
   // 不認證接口
   s.Group("/", func(group *ghttp.RouterGroup) {
      group.Middleware(CORS)
      // 調(diào)試路由
      group.ALL("/hello", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("hello"))
      })
   })
   // 認證接口
   loginFunc := Login
   // 啟動gtoken
   gfToken := &gtoken.GfToken{
      ServerName:       TestServerName,
      LoginPath:        "/login",
      LoginBeforeFunc:  loginFunc,
      LogoutPath:       "/user/logout",
      AuthExcludePaths: g.SliceStr{"/user/info", "/system/user/info"}, // 不攔截路徑 /user/info,/system/user/info,/system/user,
      MultiLogin:       g.Config().GetBool("gToken.MultiLogin"),
   }
   s.Group("/", func(group *ghttp.RouterGroup) {
      group.Middleware(CORS)
      gfToken.Middleware(group)
      group.ALL("/system/user", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("system user"))
      })
      group.ALL("/user/data", func(r *ghttp.Request) {
         r.Response.WriteJson(gfToken.GetTokenData(r))
      })
      group.ALL("/user/info", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("user info"))
      })
      group.ALL("/system/user/info", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("system user info"))
      })
   })
   // 啟動gtoken
   gfAdminToken := &gtoken.GfToken{
      ServerName: TestServerName,
      //Timeout:         10 * 1000,
      LoginPath:        "/login",
      LoginBeforeFunc:  loginFunc,
      LogoutPath:       "/user/logout",
      AuthExcludePaths: g.SliceStr{"/admin/user/info", "/admin/system/user/info"}, // 不攔截路徑 /user/info,/system/user/info,/system/user,
      MultiLogin:       g.Config().GetBool("gToken.MultiLogin"),
   }
   s.Group("/admin", func(group *ghttp.RouterGroup) {
      group.Middleware(CORS)
      gfAdminToken.Middleware(group)
      group.ALL("/system/user", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("system user"))
      })
      group.ALL("/user/info", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("user info"))
      })
      group.ALL("/system/user/info", func(r *ghttp.Request) {
         r.Response.WriteJson(gtoken.Succ("system user info"))
      })
   })
}
func Login(r *ghttp.Request) (string, interface{}) {
   username := r.GetString("username")
   passwd := r.GetString("passwd")
   if username == "" || passwd == "" {
      r.Response.WriteJson(gtoken.Fail("賬號或密碼錯誤."))
      r.ExitAll()
   }
   return username, "1"
   /**
   返回的第一個參數(shù)對應(yīng):userKey
   返回的第二個參數(shù)對應(yīng):data
   {
       "code": 0,
       "msg": "success",
       "data": {
           "createTime": 1652838582190,
           "data": "1",
           "refreshTime": 1653270582190,
           "userKey": "王中陽",
           "uuid": "ac75676efeb906f9959cf35f779a1d38"
       }
   }
   */
}
// 跨域
func CORS(r *ghttp.Request) {
   r.Response.CORSDefault()
   r.Middleware.Next()
}

啟動項目:

訪問不認證接口:返回成功

 

 

未登錄時訪問認證接口:返回錯誤

請求登錄接口:返回token

攜帶token再次訪問認證接口:返回成功

以上就跑通了主體流程,就是這么簡單。

到此這篇關(guān)于gtoken替換jwt實現(xiàn)sso登錄的文章就介紹到這了,更多相關(guān)gtoken實現(xiàn)sso登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go設(shè)計模式之生成器模式詳細講解

    Go設(shè)計模式之生成器模式詳細講解

    生成器模式將一個復(fù)雜對象的構(gòu)建和它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。生成器模式的主要功能是構(gòu)建復(fù)雜的產(chǎn)品,而且是細化地、分步驟地構(gòu)建產(chǎn)品,也就是說生成器模式重在一步一步解決構(gòu)建復(fù)雜對象的問題
    2023-01-01
  • 代碼之美:探索Go語言斷行規(guī)則的奧秘

    代碼之美:探索Go語言斷行規(guī)則的奧秘

    Go語言是一門以簡潔、清晰和高效著稱的編程語言,而斷行規(guī)則是其代碼風(fēng)格的重要組成部分,通過深入研究Go語言的斷行規(guī)則,我們可以更好地理解和編寫優(yōu)雅的代碼,本文將從語法規(guī)范、代碼風(fēng)格和最佳實踐等方面進行探討,幫助讀者更好地理解和應(yīng)用Go語言的斷行規(guī)則
    2023-10-10
  • GORM不定參數(shù)的用法最佳實踐

    GORM不定參數(shù)的用法最佳實踐

    這篇文章主要為大家介紹了GORM不定參數(shù)的用法最佳實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 通過示例深度理解Go channel range

    通過示例深度理解Go channel range

    這篇文章主要為大家介紹了Go channel range使用示例深度理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • GO語言Context的作用及各種使用方法

    GO語言Context的作用及各種使用方法

    golang的Context包是專門用來處理多個goroutine之間與請求域的數(shù)據(jù)、取消信號、截止時間等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于GO語言Context的作用及各種使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Go 面向包新提案透明文件夾必要性分析

    Go 面向包新提案透明文件夾必要性分析

    這篇文章主要為大家介紹了Go 面向包新提案,透明文件夾必要性分析,看看是否合適加進 Go 特性中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 淺談Go中數(shù)字轉(zhuǎn)換字符串的正確姿勢

    淺談Go中數(shù)字轉(zhuǎn)換字符串的正確姿勢

    這篇文章主要介紹了淺談Go中數(shù)字轉(zhuǎn)換字符串的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南

    golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南

    MongoDB是Nosql中常用的一種數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • golang實現(xiàn)循環(huán)隊列的示例代碼

    golang實現(xiàn)循環(huán)隊列的示例代碼

    循環(huán)隊列是一種使用固定大小的數(shù)組來實現(xiàn)隊列的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了golang實現(xiàn)循環(huán)隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Go語言使用swagger生成接口文檔的方法

    Go語言使用swagger生成接口文檔的方法

    這篇文章主要介紹了Go語言使用swagger生成接口文檔的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

比如县| 青川县| 库尔勒市| 日喀则市| 东兰县| 富宁县| 玛曲县| 曲沃县| 屯留县| 察哈| 萍乡市| 宁阳县| 三门峡市| 吴川市| 无为县| 蒙城县| 容城县| 麻江县| 九龙县| 平远县| 舒兰市| 甘泉县| 广汉市| 宜春市| 慈溪市| 娱乐| 怀集县| 闻喜县| 湖南省| 嵊州市| 通辽市| 陆河县| 井陉县| 都江堰市| 湘阴县| 门头沟区| 南雄市| 台北市| 鹤山市| 陇川县| 承德县|