gtoken 基于 gf 框架的 token 插件开源项目

我要开发同款
匿名用户2019年06月10日
20阅读
开发技术GO语言
所属分类Google Go、其他开发相关、程序开发
授权协议Apache 2.0

作品详情

gtoken介绍基于GoFrame框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,通过Redis支持集群模式;使用简单,大家可以放心使用;

github地址:https://github.com/goflyfox/gtoken

gitee地址:https://gitee.com/goflyfox/gtoken

gtoken优势

gtoken支撑单点应用使用内存存储,也支持集群使用redis存储;完全适用于企业生产级使用;

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

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

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

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

特性说明

支持token认证,不强依赖于session和cookie,适用jwt和session认证所有场景;

支持单机gcache和集群gredis模式;

#缓存模式1gcache2gredisCacheMode=2

支持服务端缓存自动续期功能

//注:通过MaxRefresh,默认当用户第五天访问时,自动续期//超时时间默认10天Timeoutint//缓存刷新时间默认为超时时间的一半MaxRefreshint

支持分组拦截、全局拦截、深度路径拦截,便于根据个人需求定制拦截器;建议使用分组拦截方式;

框架使用简单,只需要设置登录验证方法以及登录、登出路径即可;

在gtokenv1.4.0版本开始支持分组中间件方式实现,但依然兼容全局和深度中间件实现方式;

安装教程

gopath模式:gogetgithub.com/goflyfox/gtoken

或者使用go.mod添加:requiregithub.com/goflyfox/gtokenlatest

分组中间件实现GoFrame官方推荐使用Group方式实现路由和中间件;

使用说明推荐使用分组方式实现

//启动gtokengfToken:=&gtoken.GfToken{LoginPath:    "/login",LoginBeforeFunc:loginFunc,LogoutPath:   "/user/logout",}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"))})………………})登录方法实现,通过username返回空或者r.ExitAll()\r.Exit()处理认证失败;

funcLogin(r*ghttp.Request)(string,interface{}){username:=r.GetPostString("username")passwd:=r.GetPostString("passwd")​//TODO进行登录校验ifusername==""||passwd==""{r.Response.WriteJson(gtoken.Fail("账号或密码错误."))r.ExitAll()}​returnusername,""}通过gtoken.GetTokenData(r)获取登录信息

路径拦截规则  AuthExcludePaths:g.SliceStr{"/user/info","/system/user/*"},//不拦截路径/user/info,/system/user/info,/system/user,

分组中间件实现,不需要设置AuthPaths认证路径,设置也没有作用,需要认证路径为该分组下所有路由;

使用分组拦截的是通过GoFrame的group.Middleware(authMiddleware)方法,对该分组下的所有路由进行拦截;

对登录接口路径loginPath做拦截认证放行;

严格按照GoFrame分组中间件拦截优先级;如果使用跨域中间件,建议放在跨域中间件之后;

如果配置AuthExcludePaths路径,会将配置的不拦截路径排除;

逻辑测试参考sample项目,先运行main.go,然后可运行api_test.go进行测试并查看结果;验证逻辑说明:

访问用户信息,提示未携带token

调用登录后,携带token访问正常

调用登出提示成功

携带之前token访问,提示未登录

===RUN TestAdminSystemUser  api_admin_test.go:22:1.notloginandvisituser  api_admin_test.go:29:{"code":-401,"msg":"请求错误或登录超时","data":""}  api_admin_test.go:42:2.executeloginandvisituser  api_admin_test.go:45:{"code":0,"msg":"success","data":"systemuser"}  api_admin_test.go:51:3.executelogout  api_admin_test.go:54:{"code":0,"msg":"success","data":"Logoutsuccess"}  api_admin_test.go:60:4.visituser  api_admin_test.go:65:{"code":-401,"msg":"请求错误或登录超时","data":""}全局中间件实现使用说明只需要配置登录路径、登出路径、拦截路径以及登录校验实现即可

//启动gtokengtoken:=&gtoken.GfToken{LoginPath:   "/login",LoginBeforeFunc:loginFunc,LogoutPath:   "/user/logout",AuthPaths:    g.SliceStr{"/user","/system"},//这里是按照前缀拦截,拦截/user/user/list/user/add...GlobalMiddleware:true,             //开启全局拦截,默认关闭}gtoken.Start()登录方法实现,通过username返回空或者r.ExitAll()\r.Exit()处理认证失败;

funcLogin(r*ghttp.Request)(string,interface{}){username:=r.GetPostString("username")passwd:=r.GetPostString("passwd")​//TODO进行登录校验ifusername==""||passwd==""{r.Response.WriteJson(gtoken.Fail("账号或密码错误."))r.ExitAll()}​returnusername,""}通过gtoken.GetTokenData(r)获取登录信息

路径拦截规则  AuthPaths:    g.SliceStr{"/user","/system"},      //这里是按照前缀拦截,拦截/user/user/list/user/add...  AuthExcludePaths:g.SliceStr{"/user/info","/system/user/*"},//不拦截路径/user/info,/system/user/info,/system/user,  GlobalMiddleware:true,             //开启全局拦截,默认关闭

GlobalMiddleware:true全局拦截的是通过GF的BindMiddleware方法创建拦截/*

GlobalMiddleware:false路径拦截的是通过GF的BindMiddleware方法创建拦截/user*和/system/*

按照中间件优先级路径拦截优先级很高;如果先实现部分中间件在认证前处理需要切换成全局拦截器,严格按照注册顺序即可;

程序先处理认证路径,如果满足;再排除不拦截路径;

如果只想用排除路径功能,将拦截路径设置为/*即可;

逻辑测试参考sample1项目,先运行main.go,然后可运行api_test.go进行测试并查看结果;验证逻辑说明:

访问用户信息,提示未携带token

调用登录后,携带token访问正常

调用登出提示成功

携带之前token访问,提示未登录

===RUN TestSystemUser  api_test.go:43:1.notloginandvisituser  api_test.go:50:{"code":-401,"msg":"请求错误或登录超时","data":""}  api_test.go:63:2.executeloginandvisituser  api_test.go:66:{"code":0,"msg":"success","data":"systemuser"}  api_test.go:72:3.executelogout  api_test.go:75:{"code":0,"msg":"success","data":"Logoutsuccess"}  api_test.go:81:4.visituser  api_test.go:86:{"code":-401,"msg":"请求错误或登录超时","data":""}返回码及配置项

正常操作成功返回0

未登录访问需要登录资源返回401

程序异常返回-99,如编解码错误等

SUCCESS   =0 //正常FAIL    =-1 //失败ERROR    =-99 //异常UNAUTHORIZED=-401 //未认证配置项说明具体可参考GfToken结构体,字段解释如下:

名称配置字段说明分组中间件全局中间件服务名ServerName默认空即可支持支持缓存模式CacheMode1gcache2gredis默认1支持支持缓存keyCacheKey默认缓存前缀GToken:支持支持超时时间Timeout默认10天(毫秒)支持支持缓存刷新时间MaxRefresh默认为超时时间的一半(毫秒)支持支持Token分隔符TokenDelimiter默认_支持支持Token加密keyEncryptKey默认12345678912345678912345678912345支持支持认证失败提示AuthFailMsg默认请求错误或登录超时支持支持是否支持多端登录MultiLogin默认false支持支持中间件类型MiddlewareType1、Group2、Bind3、Global;使用分组模式不需要设置支持支持登录路径LoginPath登录接口路径支持支持登录验证方法LoginBeforeFunc登录验证需要用户实现方法支持支持登录返回方法LoginAfterFunc登录完成后调用支持支持登出地址LogoutPath登出接口路径支持支持登出验证方法LogoutBeforeFunc登出接口前调用支持支持登出返回方法LogoutAfterFunc登出接口完成后调用支持支持拦截地址AuthPaths此路径列表进行认证不需要支持拦截排除地址AuthExcludePaths此路径列表不进行认证支持支持认证验证方法AuthBeforeFunc拦截认证前后调用支持支持认证返回方法AuthAfterFunc拦截认证完成后调用支持支持感谢

gf框架https://github.com/gogf/gf

查看全文
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论