gtoken替换jwt如何实现sso登录(gtoken,jwt,sso,开发技术)

时间:2024-05-02 18:11:45 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

jwt的问题

首先说明一个jwt存在的问题,也就是要替换jwt的原因:

  • jwt无法在服务端主动退出的问题

  • jwt无法作废已颁布的令牌,只能等到令牌过期问题

  • jwt携带大量用户扩展信息导致降低传输效率问题

jwt的请求流程图

gtoken替换jwt如何实现sso登录

gtoken的优势

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

gtoken的优势就是能帮助我们解决jwt的问题,另外还提供好用的特性,比如:

  1. gtoken支撑单点应用测试使用内存存储,支持个人项目文件存储,也支持企业集群使用redis存储;完全适用于企业生产级使用;

  2. 有效的避免了jwt服务端无法退出问题;

  3. 解决jwt无法作废已颁布的令牌,只能等到令牌过期问题;

  4. 通过用户扩展信息存储在服务端,有效规避了jwt携带大量用户扩展信息导致降低传输效率问题;

  5. 有效避免jwt需要客户端实现续签功能,增加客户端复杂度;支持服务端自动续期,客户端不需要关心续签逻辑;

注意问题

  • 支持服务端缓存自动续期功能,不需要通过refresh_token刷新token,简化了客户端的操作

  • 版本问题千万注意:在gtoken v1.5.0全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用GfToken v1.4.X相关版本

TIPS:下面我的演示demo和源码阅读都是基于v1.4.x版本的。

演示demo

下面的演示demo可以复制到本地main.go文件中执行,更新依赖的时候千万注意版本。

重点说一下踩的坑:

Login方法会要求我们返回两个值:

第一个值对应userKey,后续我们可以根据userKey获得token 第二个值对应data,是interface{}类型,我们可以在这里定义例如userid、username等数据。

先有这个概念即可,后面会带大家读源码。

packagemainimport("github.com/goflyfox/gtoken/gtoken""github.com/gogf/gf/frame/g""github.com/gogf/gf/net/ghttp""github.com/gogf/gf/os/glog")varTestServerNamestring//varTestServerNamestring="gtoken"funcmain(){glog.Info("########servicestart...")g.Cfg().SetPath("example/sample")s:=g.Server(TestServerName)initRouter(s)glog.Info("########servicefinish.")s.Run()}vargfToken*gtoken.GfToken/*统一路由注册*/funcinitRouter(s*ghttp.Server){//不认证接口s.Group("/",func(group*ghttp.RouterGroup){group.Middleware(CORS)//调试路由group.ALL("/hello",func(r*ghttp.Request){r.Response.WriteJson(gtoken.Succ("hello"))})})//认证接口loginFunc:=Login//启动gtokengfToken:=&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("systemuser"))})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("userinfo"))})group.ALL("/system/user/info",func(r*ghttp.Request){r.Response.WriteJson(gtoken.Succ("systemuserinfo"))})})//启动gtokengfAdminToken:=&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("systemuser"))})group.ALL("/user/info",func(r*ghttp.Request){r.Response.WriteJson(gtoken.Succ("userinfo"))})group.ALL("/system/user/info",func(r*ghttp.Request){r.Response.WriteJson(gtoken.Succ("systemuserinfo"))})})}funcLogin(r*ghttp.Request)(string,interface{}){username:=r.GetString("username")passwd:=r.GetString("passwd")ifusername==""||passwd==""{r.Response.WriteJson(gtoken.Fail("账号或密码错误."))r.ExitAll()}returnusername,"1"/**返回的第一个参数对应:userKey返回的第二个参数对应:data{"code":0,"msg":"success","data":{"createTime":1652838582190,"data":"1","refreshTime":1653270582190,"userKey":"王中阳","uuid":"ac75676efeb906f9959cf35f779a1d38"}}*/}//跨域funcCORS(r*ghttp.Request){r.Response.CORSDefault()r.Middleware.Next()}

启动项目:

gtoken替换jwt如何实现sso登录

访问不认证接口:返回成功

gtoken替换jwt如何实现sso登录

未登录时访问认证接口:返回错误

gtoken替换jwt如何实现sso登录

请求登录接口:返回token

gtoken替换jwt如何实现sso登录

携带token再次访问认证接口:返回成功

gtoken替换jwt如何实现sso登录

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:gtoken替换jwt如何实现sso登录的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:YOLOv5的Backbone源码分析下一篇:

19 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18