jwt.go 4.38 KB
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
//
//}