本次更新:
此版本主要架構全面更新,發佈 v2.X.X,不再兼容 v1.X.X,升級需謹慎
- 架構全面升級,版本更新到 v2.X.X,不再兼容 v1.X.X
- 通過
go get -u -v github.com/goflyfox/gtoken/v2獲取最新版本,升級需謹慎 - 獨立 Token、Codec、Cache 接口,方便擴展
- 採用 goframe 標準中間件方式認證,調用更加直觀
- 認證錯誤統一調整為 code:300,便於前端處理
- 具體使用細節見項目 ReadMe 文件
gtoken
介紹
基於 GoFrame 框架的 token 插件,通過服務端驗證方式實現 token 認證;已完全可以支撐線上 token 認證,通過 Redis 支持集羣模式;使用簡單,大家可以放心使用;
- GoFrame v2.X.X 全面適配
- GoFrame v1.X.X 請使用 gtoken v1.4.X 相關版本;
- 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 模式;
# 緩存模式 1 gcache 2 gredis 3 fileCache
CacheMode = 2
- 支持服務端緩存自動續期功能
// 注:通過MaxRefresh,默認當用户第五天訪問時,自動續期
// 超時時間 默認10天
Timeout int
// 緩存刷新時間 默認為超時時間的一半
MaxRefresh int
- 框架使用簡單,只需要認證攔截器註冊、登錄 Token 生成、登出 Token 銷燬即可;
安裝教程
獲取最新版本: go get -u -v github.com/goflyfox/gtoken/v2
使用説明
- 初始化配置 gtoken.Options {}, 並創建 gtoken 對象 (
gtoken.NewDefaultToken);參數詳情見《配置項説明》部分 - 註冊認證中間件
gtoken.NewDefaultMiddleware(gfToken).Auth - 登陸認證成功後,生成 Token(
gfToken.Generate)並返回給客户端 - 登出時銷燬 Token (
gfToken.Destroy)
// 創建gtoken對象
gftoken := gtoken.NewDefaultToken(gtoken.Options{})
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(CORS)
// 註冊GfToken中間件
group.Middleware(gtoken.NewDefaultMiddleware(gfToken).Auth)
group.ALL("/system/data", func(r *ghttp.Request) {
// 獲取登陸信息
_, data, err := gfToken.Get(r.Context(), r.GetCtxVar(gtoken.KeyUserKey).String())
if err != nil {
r.Response.WriteJson(RespError(err))
}
r.Response.WriteJson(RespSuccess(data))
})
group.ALL("/user/logout", func(r *ghttp.Request) {
// 登出銷燬Token
_ = gfToken.Destroy(ctx, r.GetCtxVar(gtoken.KeyUserKey).String())
r.Response.WriteJson(RespSuccess("user logout"))
})
})
s.BindHandler("/login", func(r *ghttp.Request) {
// 認證成功調用Generate生成Token
token, err := gfToken.Generate(ctx, username, "1")
if err != nil {
r.Response.WriteJson(RespError(err))
r.ExitAll()
}
r.Response.WriteJson(RespSuccess(g.Map{
gtoken.KeyUserKey: username,
gtoken.KeyToken: token,
}))
})
配置項説明
具體可參考 GfToken 結構體,字段解釋如下:
| 名稱 | 配置字段 | 説明 |
|---|---|---|
| 緩存模式 | CacheMode | 1 gcache 2 gredis 3 fileCache 默認 1 |
| 緩存 key | CachePreKey | 默認緩存前綴 GToken: |
| 超時時間 | Timeout | 默認 10 天(毫秒) |
| 緩存刷新時間 | MaxRefresh | 默認為超時時間的一半(毫秒) |
| Token 分隔符 | TokenDelimiter | 默認_ |
| Token 加密 key | EncryptKey | 默認 12345678912345678912345678912345 |
| 是否支持多端登錄 | MultiLogin | 默認 false |
| 攔截排除地址 | excludePaths | 此路徑列表不進行認證 |
示例
使用示例,請先參考 gtoken/example/sample/test/backend/server.go 文件
感謝
- gf 框架 https://github.com/gogf/gf
- 歷史文檔 v1:https://goframe.org/pages/viewpage.action?pageId=1115974