整合dxvgef/token实现JWT功能
dxvgef/token
包仿照JWT的原理实现了一种Token算法,以下是与HTTP Dispatcher
整合的示例:
- package main
- import (
- "github.com/dxvgef/httpdispatcher"
- "net/http"
- "log"
- "github.com/dxvgef/token"
- )
- //定义token的结构体
- type TokenClaims struct {
- UserID int64
- token.ClaimsAttr
- }
- //签名密钥
- const key string = "secret"
- func main() {
- //定义claims
- var claims TokenClaims
- claims.UserID = 123
- //生成一个测试用的token
- tokenStr, err := token.NewString(claims, key)
- if err != nil {
- log.Println(err.Error())
- return
- }
- log.Println("测试Token:"+tokenStr)
- //获得一个调度器的实例化对象
- var dispatcher = httpdispatcher.New()
- //在入口路由里传入token验证处理器
- router := dispatcher.Router.GROUP("/secret", func(ctx *httpdispatcher.Context) error {
- //解析token字符串,得到token对象
- tk, err := token.Parse(tokenStr, &TokenClaims{}, key)
- if err != nil {
- return ctx.Event(err)
- }
- //将claims断言成*token.TokenClaims类型
- claims := tk.Claims.(*TokenClaims)
- //检查token是否有效
- if claims.Valid() == false {
- ctx.ResponseWriter.WriteHeader(401)
- ctx.ResponseWriter.Write([]byte("token无效"))
- return nil
- }
- //如果有效,执行下一个处理器
- return ctx.Next(true)
- })
- //在路由组中定义GET路由测试token验证
- router.GET("/", func(ctx *httpdispatcher.Context) error {
- log.Println("Token通过验证,执行了路由处理器")
- return nil
- })
- svr := &http.Server{
- Addr: ":8080",
- Handler: dispatcher,
- }
- if err := svr.ListenAndServe(); err != nil {
- log.Fatal(err.Error())
- }
- }