1170 字
6 分钟
GToken 介绍 - 基于 GoFrame 的 Token 认证插件
什么是 GToken?
GToken 是一个基于 GoFrame 框架开发的 token 认证插件,通过服务端验证方式实现 token 认证。它已经完全可以支撑线上 token 认证,并通过 Redis 支持集群模式。
版本适配
- GoFrame v2.X.X:使用 gtoken v2.x 版本
- GoFrame v1.X.X:使用 gtoken v1.4.x 版本
GToken 的优势
相比传统的 JWT 方案,GToken 具有以下显著优势:
1. 支持服务端退出
有效的避免了 JWT 服务端无法退出问题。在 JWT 方案中,一旦令牌颁发,在过期前都无法主动使其失效,而 GToken 通过服务端存储,可以随时销毁令牌。
2. 令牌可作废
解决 JWT 无法作废已颁布的令牌,只能等到令牌过期问题。通过服务端存储,可以随时调用 Destroy 方法使令牌立即失效。
3. 高效的扩展信息存储
通过用户扩展信息存储在服务端,有效规避了 JWT 携带大量用户扩展信息导致降低传输效率问题。JWT 需要在每个请求的 token 中携带用户信息,而 GToken 只在服务端存储,客户端只保存 token 本身。
4. 自动续期
有效避免 JWT 需要客户端实现续签功能,增加客户端复杂度。GToken 支持服务端自动续期,客户端不需要关心续签逻辑。
// 通过 MaxRefresh 配置,默认当用户第五天访问时,自动续期// 超时时间 默认 10 天Timeout int// 缓存刷新时间 默认为超时时间的一半MaxRefresh int特性说明
- 支持 token 认证:不强依赖于 session 和 cookie,适用 JWT 和 session 认证所有场景
- 多种缓存模式:支持单机 gcache 和集群 gredis 模式
// 缓存模式 1 gcache 2 gredis 3 fileCacheCacheMode = 2安装
获取最新版本:
go get -u -v github.com/goflyfox/gtoken/v2快速开始
1. 初始化配置
import ( "github.com/goflyfox/gtoken/v2")
// 创建 gtoken 对象gfToken := gtoken.NewDefaultToken(gtoken.Options{ CacheMode: 2, // 1 gcache 2 gredis 3 fileCache CachePreKey: "GToken:", // 缓存 key 前缀 Timeout: 10 * 24 * 3600, // 超时时间 10 天(秒) MaxRefresh: 5 * 24 * 3600, // 缓存刷新时间 5 天(秒) TokenDelimiter: "_", // Token 分隔符 EncryptKey: "12345678912345678912345678912345", // Token 加密 key MultiLogin: false, // 是否支持多端登录 AuthExcludePaths: []string{"/login", "/register"}, // 拦截排除地址})2. 注册认证中间件
s := ghttp.NewServer()s.SetPort(8199)
s.Group("/", func(group *ghttp.RouterGroup) { group.Middleware(CORS) // 注册 GfToken 中间件 group.Middleware(gtoken.NewDefaultMiddleware(gfToken).Auth)
// 需要认证的路由 group.ALL("/system/data", func(r *ghttp.Request) { // 获取登陆信息 ctx := r.Context() userKey := r.GetCtxVar(gtoken.KeyUserKey).String() _, data, err := gfToken.Get(ctx, userKey) if err != nil { r.Response.WriteJson(g.Map{"code": 500, "msg": err.Error()}) return } r.Response.WriteJson(g.Map{"code": 0, "data": data}) })
// 登出路由 group.ALL("/user/logout", func(r *ghttp.Request) { ctx := r.Context() userKey := r.GetCtxVar(gtoken.KeyUserKey).String() _ = gfToken.Destroy(ctx, userKey) r.Response.WriteJson(g.Map{"code": 0, "msg": "user logout"}) })})3. 登录生成 Token
s.BindHandler("/login", func(r *ghttp.Request) { ctx := r.Context() username := r.Get("username").String() password := r.Get("password").String()
// 验证用户名密码(这里省略验证逻辑) if !validateUser(username, password) { r.Response.WriteJson(g.Map{"code": 401, "msg": "invalid credentials"}) return }
// 认证成功调用 Generate 生成 Token token, err := gfToken.Generate(ctx, username, "1") if err != nil { r.Response.WriteJson(g.Map{"code": 500, "msg": err.Error()}) r.ExitAll() return }
r.Response.WriteJson(g.Map{ "code": 0, "data": g.Map{ gtoken.KeyUserKey: username, gtoken.KeyToken: token, }, })})
func validateUser(username, password string) bool { // 实现用户验证逻辑 return true}配置项说明
| 名称 | 配置字段 | 说明 |
|---|---|---|
| 缓存模式 | CacheMode | 1 gcache 2 gredis 3 fileCache 默认 1 |
| 缓存 key | CachePreKey | 默认缓存前缀 GToken: |
| 超时时间 | Timeout | 默认 10 天(秒) |
| 缓存刷新时间 | MaxRefresh | 默认为超时时间的一半(秒) |
| Token 分隔符 | TokenDelimiter | 默认 _ |
| Token 加密 key | EncryptKey | 默认 12345678912345678912345678912345 |
| 是否支持多端登录 | MultiLogin | 默认 false |
| 拦截排除地址 | AuthExcludePaths | 此路径列表不进行认证 |
| 拦截返回函数 | ResFun | 认证失败返回函数,默认返回 Code:300 |
使用建议
由于中间件采用洋葱模型,注册 MiddlewareAuth 认证中间件时,建议放在:
- 在
MiddlewareCORS之后:确保跨域处理优先 - 在用户权限
MiddlewareUserPermissions认证之前:确保先认证再授权 - 在 Response 处理
MiddlewareHandlerResponse之前:确保响应处理正确
s.Group("/", func(group *ghttp.RouterGroup) { group.Middleware(CORS) // 1. CORS 中间件 group.Middleware(gtoken.NewDefaultMiddleware(gfToken).Auth) // 2. Token 认证 group.Middleware(MiddlewareUserPermissions) // 3. 权限验证 // ... 业务路由})项目扩展
GToken-JWT
如果需要短期 token 场景,可以使用 gtoken-jwt,这是基于 gtoken 的 JWT 扩展。
总结
GToken 是一个功能完善、适用于企业生产级的 token 认证插件。它通过服务端存储的方式,有效解决了 JWT 的多个痛点问题:
- ✅ 支持服务端主动退出
- ✅ 令牌可随时作废
- ✅ 高效的扩展信息存储
- ✅ 服务端自动续期
- ✅ 支持单机和集群模式
如果你的项目基于 GoFrame 框架,并且需要可靠的 token 认证方案,GToken 是一个值得考虑的选择。
参考资源
- Gitee: https://gitee.com/goflyfox/gtoken
- GitHub: https://github.com/goflyfox/gtoken
- GoFrame: https://github.com/gogf/gf
GToken 介绍 - 基于 GoFrame 的 Token 认证插件
https://www.jflyfox.com/posts/gtoken/