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
133
134
135
136
137
138
139
140
141
142
143
144
package utils
import (
"github.com/dgrijalva/jwt-go"
"github.com/pkg/errors"
"system_pay/conf"
"system_pay/setting"
"time"
)
// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们这里需要额外记录一个username字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyClaims struct {
UserName string `json:"user_name" description:"用户名称"` // 用户名称
UserId string `json:"user_id" description:"用户ID"` // 用户ID
PhoneMob string `json:"phone_mob" description:"用户手机号"` // 用户手机号
//HospitalCode string `json:"hospital_code" description:"医院唯一码"` // 医院唯一码
//ChainCode string `json:"chain_code" description:"连锁码"` // 连锁码
//HospitalID string `json:"hospital_id" description:"医院ID"` // 医院ID
//HospitalName string `json:"hospital_name" description:"医院名称"` // 医院名称
//ChainID string `json:"chain_id" description:"连锁ID"` // 连锁ID
jwt.StandardClaims
}
var MySecret = []byte(setting.Conf.JwtSecret)
//const TokenExpireDuration = time.Hour * 24 * 7
// 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")
}
// GetToken 生成JWT
func GetToken(phoneMob, userId, userName string) (string, error) {
// 进行des加密
desUserName := GetEncryptDes(userName)
desUserId := GetEncryptDes(userId)
desPhoneMob := GetEncryptDes(phoneMob)
//desHospitalCode := GetEncryptDes(hospitalCode)
//
//desChainCode := GetEncryptDes(chainCode)
//
//desHospitalName := GetEncryptDes(hospitalName)
//
//strHospitalID := strconv.Itoa(hospitalID)
//
//desHospitalID := GetEncryptDes(strHospitalID)
//
//strChainID := strconv.Itoa(chainID)
//
//desChainID := GetEncryptDes(strChainID)
// 创建一个我们自己的声明
c := MyClaims{
desUserName, // 自定义字段
desUserId, // 自定义字段
desPhoneMob, // 自定义字段
//"", // 自定义字段
//"", // 自定义字段
//"",
//"",
//"", // 自定义字段
jwt.StandardClaims{
ExpiresAt: time.Now().Add(conf.TokenExpireDuration).Unix(), // 过期时间
Issuer: "system_pay", // 签发人
},
}
//使用指定的签名方法创建签名对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
//使用指定的secret签名并获得完整的编码后的字符串token
return token.SignedString(MySecret)
}
// GetToken 生成JWT
//func GetToken(userPhone, hospitalCode, chainCode, hospitalName string, hospitalID int, chainID int) (string, error) {
//
// // 进行des加密
// desUserPhone := GetEncryptDes(userPhone)
//
// desHospitalCode := GetEncryptDes(hospitalCode)
//
// desChainCode := GetEncryptDes(chainCode)
//
// desHospitalName := GetEncryptDes(hospitalName)
//
// strHospitalID := strconv.Itoa(hospitalID)
//
// desHospitalID := GetEncryptDes(strHospitalID)
//
// strChainID := strconv.Itoa(chainID)
//
// desChainID := GetEncryptDes(strChainID)
//
// // 创建一个我们自己的声明
// c := MyClaims{
// desUserPhone, // 自定义字段
// desHospitalCode, // 自定义字段
// desChainCode, // 自定义字段
// desHospitalID,
// desHospitalName,
// desChainID, // 自定义字段
// jwt.StandardClaims{
// ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
// Issuer: "system_pay", // 签发人
// },
// }
// //使用指定的签名方法创建签名对象
// token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
// //使用指定的secret签名并获得完整的编码后的字符串token
// return token.SignedString(MySecret)
//
//}
// GetTheInformationCarriedInTheToken 获取token中信息
//func GetTheInformationCarriedInTheToken(token string) (userPhone string, chainCode string, err error) {
//
// parseToken, err := ParseToken(token)
// if err != nil {
// zap.L().Error("解析token失败")
// return "", "", err
// }
//
// return ToDesDecrypt(parseToken.UserPhone), ToDesDecrypt(parseToken.HospitalCode), nil
//
//}