介绍
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" )
var gToken gtoken.Token
func Init() { options := gtoken.Options{ CacheMode: 1, Timeout: 10 * 3600 * 1000, MaxRefresh: 5 * 3600 * 1000, MultiLogin: false, EncryptKey: []byte("32byte-crypt-code"), AuthExcludePaths: g.SliceStr{ "/hello", "/api/v1/user/login", }, }
gToken = gtoken.NewDefaultToken(options) }
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 }
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()) 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
| func (m *DefaultMiddleware) Auth(r *ghttp.Request) error { authHeader := r.Header.Get("Authorization") if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") { return m.ResFun(r, gerror.New("未携带Token")) } token := strings.TrimPrefix(authHeader, "Bearer ")
valid, userKey, data := m.gToken.CheckToken(r.Context(), token) if !valid { return m.ResFun(r, gerror.New("Token无效或已过期")) }
r.SetCtxVar(gtoken.KeyUserKey, userKey) r.SetCtxVar(gtoken.KeyData, data)
return r.Middleware.Next() }
|