// jwt 工具文件
package tool
import (
"errors"
"fmt"
"github.com/golang-jwt/jwt/request"
"log"
"reflect"
"time"
)
//token中存储的信息
type TokenInfo struct {
Id uint
Name string
Type int
GameId int
jwt.StandardClaims
}
const TokenExpireDuration = time.Hour * 24 * 2 //过期时间 2天
var Secret = []byte("my name is hanmeimei") //Secret(盐) 用来加密解密
// 生成 jwt token
func GenToken(ID uint, Name string, Type int, GameId int) (string, error) {
var claims = TokenInfo{
ID,
Name,
Type,
GameId,
jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
Issuer: "zhaohaiyu", // 签发人
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString([]byte(Secret))
if err != nil {
log.Println("生成token失败:", err)
return "", fmt.Errorf("生成token失败:%v", err)
}
return signedToken, nil
}
// 验证 jwt token
func ParseToken(tokenStr string) (*TokenInfo, error) {
token, err := jwt.ParseWithClaims(tokenStr, &TokenInfo{}, func(token *jwt.Token) (i interface{}, err error) { // 解析token
return Secret, nil
})
if err != nil {
log.Println(err)
return nil, err
}
if claims, ok := token.Claims.(*TokenInfo); ok && token.Valid { // 校验token
return claims, nil
}
return nil, errors.New("invalid token")
}
// 从请求头中获取token 本人token放在 请求头中Authorization中,根据自己需求获取
func GetTokenFromRequest(c *gin.Context) (token *jwt.Token, err error) {
token, err = request.ParseFromRequest(c.Request, request.AuthorizationHeaderExtractor,
func(token *jwt.Token) (interface{}, error) {
return Secret, nil
})
return token, err
}
// 根据key从载荷中获取数据
func GetValueFromTokenClaims(key string, claims jwt.Claims) string {
v := reflect.ValueOf(claims)
if v.Kind() == reflect.Map {
for _, k := range v.MapKeys() {
value := v.MapIndex(k)
if fmt.Sprintf("%s", k.Interface()) == key {
return fmt.Sprintf("%v", value.Interface())
}
}
}
return ""
}
//下面为获取token中存储的值
//如需要获取Name
//获取token中存的值
token, _ := tool.GetTokenFromRequest(c)
name := tool.GetValueFromTokenClaims("Name", token.Claims)
fmt.Println(name)