gtoken的中间件的实现

介绍

gtoken是一款基于goframe的第三方token生成,认证插件。[项目地址](gtoken/example/api_test.go at master · goflyfox/gtoken)

简单使用方式

1.中间件构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package gtoken

import (
"github.com/goflyfox/gtoken/v2/gtoken"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)

// 全局gtoken实例
var gToken gtoken.Token

// Init 初始化gtoken配置(在服务启动时调用)
func Init() {
// 根据实际需求调整配置
options := gtoken.Options{
CacheMode: 1, // 1: gcache(单机), 2: redis(集群)
Timeout: 10 * 3600 * 1000, // Token有效期(10小时,毫秒)
MaxRefresh: 5 * 3600 * 1000, // 自动刷新阈值(5小时,毫秒)
MultiLogin: false, // 禁止多端登录
EncryptKey: []byte("32byte-crypt-code"), // 32位加密密钥
AuthExcludePaths: g.SliceStr{ // 无需认证的路径
"/hello", // 示例:你的hello接口
"/api/v1/user/login", // 登录接口
},
}

// 创建gtoken实例
gToken = gtoken.NewDefaultToken(options)
}

// Middleware 返回gtoken认证中间件
func Middleware() ghttp.HandlerFunc {
middleware := gtoken.NewDefaultMiddleware(gToken)
// 自定义认证失败响应
middleware.ResFun = func(r *ghttp.Request, err error) {
r.Response.WriteJson(g.Map{
"code": 401,
"message": "认证失败:" + err.Error(),
"data": nil,
})
}
return middleware.Auth
}

// GetGToken 获取gtoken实例(用于登录生成Token等操作)
func GetGToken() gtoken.Token {
return gToken
}

2,中间件的注册以及使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package router

import (
"GoFrameTest/internal/midleware/gtoken"
"GoFrameTest/router/user_router"

"github.com/gogf/gf/v2/net/ghttp"
)

func Init(g *ghttp.Server) {
v1 := g.Group("api/v1")
{
v1.Middleware(ghttp.MiddlewareHandlerResponse)
v1.Middleware(gtoken.Middleware())//使用gtoken中间件
user_router.RegisterUserApi(v1)
}

}

3.登录接口获取中间件的操作

后端返回的response需要添加token

1
2
3
4
5
6
7
generate, err := gtoken.GetGToken().Generate(ctx, record.Uname, record)
if err != nil {
return nil, err
}

gconv.Struct(record, &res)
res.Token = generate

中间件的简单介绍

普通中间件

分为前置逻辑:主要代码放在return r.Middleware.Next()之前。

后置逻辑:主要代码放在return r.Middleware.Next()之后。

传递请求:return r.Middleware.Next()本身。

token认证中间件

通过获取request中的Authorization,来实现获取token。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// gtoken中间件内部逻辑(简化版)
func (m *DefaultMiddleware) Auth(r *ghttp.Request) error {
// 1. 从请求头Authorization中提取Token
authHeader := r.Header.Get("Authorization")
if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") {
// 没有Token或格式错误,触发认证失败
return m.ResFun(r, gerror.New("未携带Token"))
}
token := strings.TrimPrefix(authHeader, "Bearer ") // 提取纯Token字符串

// 2. 验证Token有效性(查服务端缓存、检查过期时间等)
valid, userKey, data := m.gToken.CheckToken(r.Context(), token)
if !valid {
// Token无效/过期,触发认证失败
return m.ResFun(r, gerror.New("Token无效或已过期"))
}

// 3. Token有效,将用户信息存入上下文(供后续接口使用)
r.SetCtxVar(gtoken.KeyUserKey, userKey) // 用户唯一标识
r.SetCtxVar(gtoken.KeyData, data) // 用户附加信息

// 4. 调用Next(),让请求继续传递到后续接口
return r.Middleware.Next()
}