本文主要介绍用gtoken替代jwt实现sso登录,主要介绍替代jwt的原因和gtoken的优点。这篇文章给你做了非常详细的介绍,对你的学习或者工作有一定的参考价值。有需要的朋友可以参考一下。
目录
jwt的问题jwt的请求流程图gtoken的优势Note问题演示Demo今天和大家分享一下用gtoken代替jwt实现sso登录的经验。为了让你更好的理解,我带你去看关键的源代码。
jwt的问题
首先说明一下jwt的问题,也就是更换jwt的原因:
Jwt不能在服务器上主动退出。jwt不能让颁发的令牌失效,只能等到令牌过期。jwt携带了大量的用户扩展信息,导致传输效率降低的问题。
jwt的请求流程图
gtoken的优势
gtoken的请求流程和jwt基本相同。
gtoken的优势在于可以帮助我们解决jwt的问题。此外,它还提供易于使用的功能,例如:
Gtoken支持使用内存存储的单点应用测试、个人项目文件存储、使用redis存储的企业集群;完全适合企业生产使用;有效避免了jwt服务器无法退出的问题;解决jwt无法使颁发的令牌失效,只能等到令牌过期的问题;用户扩展信息存储在服务器中,有效避免了jwt携带大量用户扩展信息降低传输效率的问题;有效避免jwt要求客户端实现更新功能,增加客户端的复杂度;支持服务器自动更新,客户端不需要关心更新逻辑;
注意问题
支持服务器端缓存自动更新功能,不需要通过refresh_token刷新令牌,简化了客户端的操作版本。请注意:在gtoken v1.5.0中全面适配GoFrame v 2 . 0 . 0;Go v1.x.x请使用GfToken v1.4.X相关版本。
TIPS:下面我的演示demo和源码阅读都是基于v1.4.x版本的。
演示demo
下面的演示可以复制到本地main.go文件中执行。更新依赖项时请注意版本。
重点踩坑:
登录方法将要求我们返回两个值:
第一个值对应userKey,然后我们可以根据userKey得到对应数据的token的第二个值,是接口{}类型。我们可以在这里定义userid和username等数据。
先有这个概念,后面我们带你看源代码。
主包装
导入(
' github . com/goflyfox/GTO ken/GTO ken '
' github.com/gogf/gf/frame/g '
' github.com/gogf/gf/net/ghttp '
' github.com/gogf/gf/os/glog '
)
var TestServerName字符串
//var test servername string=' gt oken '
func main() {
格洛格。信息(' # # # # # # # #服务启动.')
g.Cfg()。SetPath('示例/样本')
s :=g.Server(测试服务器名称)
初始化路由器
格洛格。信息(' # # # # # # # # #服务完成。')
南运行()
}
var gfToken *gtoken。GfToken
/*
统一路线注册
*/
func initRouter(s *ghttp。服务器){
//不验证接口
南Group('/'),func(group *ghttp。RouterGroup) {
团体。中间件(CORS)
//调试路由
团体。ALL('/hello ',func(r *ghttp。请求){
r.Response.WriteJson(gtoken。Succ('hello '))
})
})
//认证接口
loginFunc :=登录
//启动gtoken
gfToken :=gtoken。GfToken{
服务器名:TestServerName,
登录路径:“/login”,
LoginBeforeFunc: loginFunc,
logout path:“/user/logout”,
AuthExcludePaths:g . slice str { '/user/info ','/system/user/info'},//不要阻塞路径/user/info,/system/user/info,/system/user,
MultiLogin: g.Config()。GetBool('gToken。多重登录’),
}
南Group('/'),func(group *ghttp。RouterGroup) {
团体。中间件(CORS)
gfToken。中间件(集团)
团体。ALL('/system/user ',func(r *ghttp。请求){
r.Response.WriteJson(gtoken。Succ(“系统用户”))
})
团体。ALL('/user/data ',func(r *ghttp。请求){
r.Response.WriteJson(gfToken。GetTokenData(r))
})
团体。ALL('/user/info ',func(r *ghttp。请求){
r.Response.WriteJson(gtoken。Succ(“用户信息”))
})
团体。ALL('/system/user/info ',func(r *ghttp。请求){
r.Response.WriteJson(gtoken .Succ(“系统用户信息"))
})
})
//启动托肯
gfAdminToken :=gtoken .GfToken{
服务器名:测试服务器名称,
//超时:10 * 1000,
登录路径:"/登录",
LoginBeforeFunc: loginFunc,
注销路径:"/用户/注销",
AuthExcludePaths:g . slice str { '/admin/user/info ','/admin/system/user/info'},//不拦截路径/用户/信息,/系统/用户/信息,/系统/用户,
多重登录:g.Config().GetBool('gToken .多重登录'),
}
南Group('/admin ',func(group *ghttp .RouterGroup) {
团体。中间件(CORS)
gfAdminToken .中间件(集团)
团体ALL('/system/user ',func(r *ghttp .请求){
r.Response.WriteJson(gtoken .Succ(“系统用户"))
})
团体ALL('/user/info ',func(r *ghttp .请求){
r.Response.WriteJson(gtoken .Succ(“用户信息"))
})
团体ALL('/system/user/info ',func(r *ghttp .请求){
r.Response.WriteJson(gtoken .Succ(“系统用户信息"))
})
})
}
功能登录(r *ghttp .请求)(字符串,接口{}) {
用户名:=r.GetString('用户名')
passwd :=r.GetString('passwd ')
如果用户名=='' ||密码=='' {
r.Response.WriteJson(gtoken .失败('账号或密码错误.'))
r.ExitAll()
}
返回用户名,"1"
/**
返回的第一个参数对应:用户键
返回的第二个参数对应:数据
{
'代码':0,
消息':'成功,
数据':{
'创建时间':1652838582190,
数据':' 1 ',
'刷新时间':1653270582190,
用户密钥":"王中阳,
' uuid ':' AC 75676 efeb 906 f 9959 cf 35 f 779 a1 d 38 '
}
}
*/
}
//跨域
func CORS(r *ghttp .请求){
r.Response.CORSDefault()
r.中间件。下一个()
}
启动项目:
访问不认证接口:返回成功
未登录时访问认证接口:返回错误
请求登录接口:返回代币
携带代币再次访问认证接口:返回成功
以上就跑通了主体流程,就是这么简单。
到此这篇关于托肯替换jwt实现单点登录(单点登录的缩写)登录的文章就介绍到这了,更多相关托肯实现单点登录(单点登录的缩写)登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。