gin jwt中间件

127 阅读1分钟

gin使用jwt的使用。记录一下 以下是一个使用Gin框架和JWT的简单示例,包括中间件的初始化和保护路由的使用。

首先,安装JWT相关的包:github.com/dgrijalva/jwt-go 然后,创建一个简单的Gin应用并使用JWT:

package main
func main() {

    r := gin.Default()
    r.GET("/", func (c *gin.Context) {
        pkg.Response(c, 200, 200, "ok")
    })


}
package pkg

import (
    "errors"
    "github.com/dgrijalva/jwt-go"
    "time"
)

type MyClaims struct {
    Username string `json:"username"`
    Id       int    `json:"id"`
    jwt.StandardClaims
}

const TokenExpireDuration = time.Hour * 1

var MySecret = []byte("axxuwmmccgollodadsafsqwer123")

// GenToken 生成JWT
func GenToken(username string, id int) (string, error) {
    // 创建一个我们自己的声明
    c := MyClaims{
       username, // 自定义字段
       id,
       jwt.StandardClaims{
          ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
          Issuer:    "codehubxxx",                               // 签发人
       },
    }
    // 使用指定的签名方法创建签名对象
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
    // 使用指定的secret签名并获得完整的编码后的字符串token
    return token.SignedString(MySecret)
}

// ParseToken 解析JWT
func ParseToken(tokenString string) (*MyClaims, error) {
    // 解析token
    token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {
       return MySecret, nil
    })
    if err != nil {
       return nil, err
    }
    if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token
       return claims, nil
    }
    return nil, errors.New("invalid token")
}

func Logout() {
    // 可以在这里添加逻辑来删除用户的session信息等
    // 使JWT失效
    token := jwt.New(jwt.SigningMethodHS256)
    token.Claims = jwt.MapClaims{
       "exp": time.Now().Add(-1 * time.Minute).Unix(), // 设置为过去的时间使得令牌失效
    }
}

jwt中间件

package middleware

import (
    "blog/pkg"
    "github.com/gin-gonic/gin"
    "net/http"
    "strings"
)

// AuthMiddleWare 定义一个中间件函数来验证JWT令牌
func AuthMiddleWare() gin.HandlerFunc {
    return func(ctx *gin.Context) {
       // 假设Token放在Header的Authorization中,并使用Bearer开头
       tokenString := ctx.GetHeader("Authorization")
       if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
          pkg.Response(ctx, http.StatusUnauthorized, http.StatusUnauthorized, "解析令牌错误")
          ctx.Abort()
          return
       }
       // 去掉Bearer
       tokenString = tokenString[7:]
       // 使用之前定义好的解析JWT的函数 ParseToken 来解析它
       myCli, err := pkg.ParseToken(tokenString)
       if err != nil {
          pkg.Response(ctx, http.StatusUnauthorized, http.StatusUnauthorized, "非法令牌")
          ctx.Abort()
          return
       }
       userId := myCli.Id
       // 验证通过,获取claim中的userid
       ctx.Set("uid", userId)
       ctx.Next()

    }

}