脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - gtoken替换jwt实现sso登录的问题小结

gtoken替换jwt实现sso登录的问题小结

2022-10-11 12:20数据猿视觉 Golang

这篇文章主要介绍了gtoken替换jwt实现sso登录,主要介绍了替换jwt的原因分析及gtoken的优势,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

今天和大家分享一下使用gtoken替换jwt实现sso登录的经验,为了让大家更好的理解会带大家读一下重点的源码。

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等数据。

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

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
/*
统一路由注册
*/
func initRouter(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
 // 启动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"
 /**
 返回的第一个参数对应:userKey
 返回的第二个参数对应: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()
}

启动项目:

gtoken替换jwt实现sso登录的问题小结

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

gtoken替换jwt实现sso登录的问题小结

 

 

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

gtoken替换jwt实现sso登录的问题小结

请求登录接口:返回token

gtoken替换jwt实现sso登录的问题小结

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

gtoken替换jwt实现sso登录的问题小结

以上就跑通了主体流程,就是这么简单。

到此这篇关于gtoken替换jwt实现sso登录的文章就介绍到这了,更多相关gtoken实现sso登录内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Maisucsdn/article/details/124876365

延伸 · 阅读

精彩推荐
  • Golanggo等待一组协程结束的操作方式

    go等待一组协程结束的操作方式

    这篇文章主要介绍了go等待一组协程结束的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cj_2866142021-06-15
  • Golang手把手带你走进Go语言之语法基础解析

    手把手带你走进Go语言之语法基础解析

    这篇文章主要介绍了手把手带你走进Go语言之语法基础,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    我是小白呀10902021-09-19
  • GolangGolang学习笔记(一):简介

    Golang学习笔记(一):简介

    这篇文章主要介绍了Golang学习笔记(一):简介,本文讲解了Go语言最主要的特性、安装、环境变量设置、整体目录结构、Helloworld、go命令、调试、编辑器设...

    脚本之家4692020-04-26
  • GolangGo语言通道之无缓冲通道

    Go语言通道之无缓冲通道

    这篇文章介绍了Go语言通道之无缓冲通道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    奋斗的大橙子3612022-07-16
  • GolangGolang中重复错误处理的优化方法

    Golang中重复错误处理的优化方法

    这篇文章主要给大家介绍了关于Golang中重复错误处理优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价...

    老王3762020-05-25
  • Golang解析go语言调用约定多返回值实现原理

    解析go语言调用约定多返回值实现原理

    这篇文章主要为大家介绍了解析go语言调用约定多返回值实现原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    晓彬_4102022-10-10
  • Golanggo判断文件夹是否存在并创建的实例

    go判断文件夹是否存在并创建的实例

    这篇文章主要介绍了go判断文件夹是否存在,并创建的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    robertkun10832021-03-16
  • Golang浅谈Golang中创建一个简单的服务器的方法

    浅谈Golang中创建一个简单的服务器的方法

    这篇文章主要介绍了浅谈Golang中创建一个简单的服务器的方法,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服...

    达闻西5492020-05-16