package middleware
import (
"mall/pkg/e"
"mall/pkg/util"
"time"
"github.com/gin-gonic/gin"
)
// jwt验证
func JWT() gin.HandlerFunc {
return func(c *gin.Context) {
var code int
code = 200
token := c.GetHeader("Authorization")
if token == "" {
code = 404
} else {
claims, err := util.ParseToken(token)
if err != nil {
code = e.ErrorAuthToken
} else if time.Now().Unix() > claims.ExpiresAt {
code = e.ErrorAuthCheckTokenTimeOut
}
}
if code != e.Success {
c.JSON(200, gin.H{
"status": code,
"msg": e.GetMsg(code),
})
//作用
c.Abort()
return
}
c.Next()
}
}
package util
import (
"time"
"github.com/golang-jwt/jwt/v4"
)
var jwtSecret = []byte("yijiansanlian")
type Claims struct {
ID uint `json:"id"`
UserName string `json:"user_name"`
Authority int `json:"authority"`
jwt.StandardClaims
}
// GenerateToken 签发token
func GenerateToken(id uint, userName string, authority int) (string, error) {
nowTime := time.Now()
expireTime := nowTime.Add(24 * time.Hour)
claims := Claims{
ID: id,
UserName: userName,
Authority: authority,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expireTime.Unix(),
Issuer: "FanOne-Mall",
},
}
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
token, err := tokenClaims.SignedString(jwtSecret)
return token, err
}
// ParseToken 验证用户token
// 解析下jwt这段代码作用
func ParseToken(token string) (*Claims, error) {
tokenCliams, err := jwt.ParseWithClaims(token, &Claims{}, func(t *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if tokenCliams != nil {
if claims, ok := tokenCliams.Claims.(*Claims); ok && tokenCliams.Valid {
return claims, nil
}
}
return nil, err
}