go jwt 实现验证,存储token,获取token中的信息

6 篇文章 0 订阅
5 篇文章 0 订阅

// jwt 工具文件

package tool

import (

"errors"

"fmt"

"github.com/gin-gonic/gin"

"github.com/golang-jwt/jwt"

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值