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
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")
}