Go Gin JWT token 使用

发布时间 2023-07-05 14:30:41作者: snake_j
package main

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

// 一些常量                                                            
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"
)

//token 签名                                                           
type JWT struct {
    SigningKey []byte
}

//Payload 结构体                                                       
type CustomClaims struct {
    Name     string `json:"name"`
    Password string `json:"password"`
    jwt.StandardClaims
}

//创建token                                                            
func (j *JWT) CreateToken(claims CustomClaims) (string, error) {
    token := jwt.New(jwt.SigningMethodHS256)
    token.Claims = claims
    res, err := token.SignedString(j.SigningKey)
    if err != nil {
        fmt.Println(err)
    }
    return res, err
}

//创建token                                                            
func generateToken() {
    j := &JWT{[]byte("man")}

    claims := CustomClaims{
        "shenxiaojun",
        "9552095520c",
        jwt.StandardClaims{
            //NotBefore: int64(time.Now().Unix() - 60),                
            ExpiresAt: int64(time.Now().Unix() + 60),
            Issuer:    "man",
        },
    }

    token, err := j.CreateToken(claims)
    if err != nil {
        fmt.Println("is error")
    }
    fmt.Println(token)
}

//解析token                                                                                                                                                                                            
func CheckJWT(tokenString string) (*CustomClaims,error) {
    j := &JWT{[]byte("man")}

    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
    } else {
        return nil,TokenExpired
    }
}

func main() {
    // generateToken()                                                                                                                                                                                 

    stoken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoic2hlbnhpYW9qdW4iLCJwYXNzd29yZCI6Ijk1NTIwOTU1MjBjIiwiZXhwIjoxNTg3ODY5MTgzLCJpc3MiOiJtYW4ifQ.tUTQM-ANNh4oWBGDv8nQUTPb6XR900IhELteEUVUCsM"
    ret,err := CheckJWT(stoken)
    if err == nil {
        fmt.Println(ret.Name)
    } else {
        fmt.Println(err)
    }
}