package claims import ( "errors" "github.com/dgrijalva/jwt-go" "time" ) type MyClaims struct { Id int `json:"id"` Username string `json:"username"` Sid string `json:"sid"` Role []string `json:"role"` jwt.StandardClaims } const TokenExpireDuration = time.Hour * 24 var MySecret = []byte("fasdge[wkejk@$gagli") // GenToken 生成JWT func GenToken(id int, username, sid string, roleName []string) (string, error) { // 创建一个我们自己的声明 c := MyClaims{ Id: id, Username: username, // 自定义字段 Sid: sid, Role: roleName, StandardClaims: jwt.StandardClaims{ ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间 Issuer: "my-project", // 签发人 }, } // 使用指定的签名方法创建签名对象 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") }