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()
}
}