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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| package jwt
import ( "errors" "fmt" "log" "net/http" "time"
"github.com/golang-jwt/jwt/v5"
"github.com/gin-gonic/gin" )
func JWTAuth() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.Header.Get("token") if token == "" { c.JSON(http.StatusOK, gin.H{ "status": -1, "msg": "请求未携带token无权限访问", }) c.Abort() return }
log.Print("get token: ", token)
j := NewJWT() claims, err := j.ParseToken(token) fmt.Println("claims", claims) if err != nil { if err == TokenExpired { c.JSON(http.StatusOK, gin.H{ "status": -1, "msg": "授权已过期", }) c.Abort() return } c.JSON(http.StatusOK, gin.H{ "status": -1, "msg": err.Error(), }) c.Abort() return } c.Set("claims", claims) } }
type JWT struct { SigningKey []byte }
var ( TokenExpired error = errors.New("Token is expired") TokenNotValidYet error = errors.New("Token not active yet") TokenMalformed error = errors.New("That's not even a token") TokenInvalid error = errors.New("Couldn't handle this token:") SignKey string = "newtrekWang" )
type CustomClaims struct { ID int `json:"userId"` Name string `json:"name"` Password string `json:"password"` jwt.RegisteredClaims }
func NewJWT() *JWT { return &JWT{ []byte(GetSignKey()), } }
func GetSignKey() string { return SignKey }
func SetSignKey(key string) string { SignKey = key return SignKey }
func (j *JWT) CreateToken(claims CustomClaims) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(j.SigningKey) }
func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { return j.SigningKey, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil } return nil, TokenInvalid }
func (j *JWT) RefreshToken(tokenString string) (string, error) {
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { return j.SigningKey, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { claims.RegisteredClaims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(time.Hour * 24))
return j.CreateToken(*claims) } return "", TokenInvalid }
|