package utils import ( "errors" "github.com/dgrijalva/jwt-go" "github.com/spf13/viper" ) type MemberInfo struct { UserName string `json:"user_name"` UserId string `json:"user_id"` CityId string `json:"city_id"` } type UserInfo struct { UserId int64 `json:"user_id"` } // MyClaims 自定义声明结构体并内嵌jwt.StandardClaims // jwt包自带的jwt.StandardClaims只包含了官方字段 // 我们这里需要额外记录一个UserID字段,所以要自定义结构体 // 如果想要保存更多信息,都可以添加到这个结构体中 type MyClaims struct { UserId int64 `json:"user_id"` //Username string `json:"username"` jwt.StandardClaims } // GenToken 生成JWT func GenToken(userID int64) (string, error) { // 创建一个我们自己的声明 // c := MyClaims{ userID, // 自定义字段 jwt.StandardClaims{ ExpiresAt: 30 * 24 * 3600 * 1000, // 过期时间 Issuer: "nbya", // 签发人 }, } // 使用指定的签名方法创建签名对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 使用指定的secret签名并获得完整的编码后的字符串token return token.SignedString([]byte(viper.GetString("jwt.secret"))) } // ParseToken 解析JWT func ParseToken(tokenString string) (*MyClaims, error) { // 解析token token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) { return []byte(viper.GetString("jwt.secret")), 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") }