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 fileCache
CacheMode = 2

安装#

获取最新版本:

Terminal window
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
}

配置项说明#

名称配置字段说明
缓存模式CacheMode1 gcache 2 gredis 3 fileCache 默认 1
缓存 keyCachePreKey默认缓存前缀 GToken:
超时时间Timeout默认 10 天(秒)
缓存刷新时间MaxRefresh默认为超时时间的一半(秒)
Token 分隔符TokenDelimiter默认 _
Token 加密 keyEncryptKey默认 12345678912345678912345678912345
是否支持多端登录MultiLogin默认 false
拦截排除地址AuthExcludePaths此路径列表不进行认证
拦截返回函数ResFun认证失败返回函数,默认返回 Code:300

使用建议#

由于中间件采用洋葱模型,注册 MiddlewareAuth 认证中间件时,建议放在:

  1. MiddlewareCORS 之后:确保跨域处理优先
  2. 在用户权限 MiddlewareUserPermissions 认证之前:确保先认证再授权
  3. 在 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 是一个值得考虑的选择。

参考资源#

GToken 介绍 - 基于 GoFrame 的 Token 认证插件
https://www.jflyfox.com/posts/gtoken/
作者
FLY的狐狸
发布于
2025-07-22
许可协议
CC BY-NC-SA 4.0