go语言整合jwt+gin框架实现token

下载库

go get -u  github.com/dgrijalva/jwt-go

编写jwt相关方法(生成token和解析token)


import (
	"errors"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"log"
	"time"
)

// jwt身份验证demo

// 设置jwt密钥secret
var jwtSecret = []byte("123")

type Claims struct {
	UserID int `json:"userId"`
	jwt.StandardClaims
}

const expire_time = 30 * time.Minute

// GenerateToken 生成token的函数
func GenerateToken(userId int) (string, error) {
	nowTime := time.Now()
	expireTime := nowTime.Add(expire_time)

	claims := Claims{
		userId, // 自行添加的信息
		jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(), // 设置token过期时间
			Issuer:    "admin",           // 设置jwt签发者
		},
	}
	// 生成token
	tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	token, err := tokenClaims.SignedString(jwtSecret)

	return token, err
}

// ParseToken 验证token的函数
func ParseToken(token string) (*Claims, error) {
	// 对token的密钥进行验证
	tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		return jwtSecret, nil
	})

	// 判断token是否过期
	if tokenClaims != nil {
		claims, _ := tokenClaims.Claims.(*Claims)
		return claims, nil
	}
	return nil, err
}

编写jwt的中间件

编写中间件的目的

为了在访问接口的时候,先校验token,token校验不通过就不需要走后续的逻辑了。

jwt中间件代码

import (
	"github.com/gin-gonic/gin"
	"medicalRecrypt/common/jwtConfig"
	"net/http"
	"time"
)

func JWT() gin.HandlerFunc {
	return func(context *gin.Context) {
		// 获取token
		token := context.GetHeader("Token")

		if token == "" {
			context.JSON(http.StatusOK, gin.H{
				"code": http.StatusUnauthorized,
				"msg":  "没有携带token",
				"data": "",
			})
			context.Abort()
			return
		} else {
			claims, err := jwtConfig.ParseToken(token)
			if err != nil {
				context.JSON(http.StatusOK, gin.H{
					"code": http.StatusUnauthorized,
					"msg":  "token验证失败",
					"data": "",
				})
				context.Abort()
				return
			} else if time.Now().Unix() > claims.StandardClaims.ExpiresAt {
				context.JSON(http.StatusOK, gin.H{
					"code": http.StatusUnauthorized,
					"msg":  "token已过期",
					"data": "",
				})
				context.Abort()
				return
			}
		}
	}
}

通过gin注册路由,实现http访问


import (
	"fmt"
	"github.com/gin-gonic/gin"
	"medicalRecrypt/controller"
)

func main() {

	//创建路由
	r := gin.Default()
	//注册组和中间件
	v1 := r.Group("/user")
	{
		//限制文件大小,默认32M,限制为1M
		r.MaxMultipartMemory = 1 << 20
		v1.POST("/login", controller.Login)
	}
	//使用jwt中间件
	v2 := r.Group("/file").Use(controller.JWT())
	{

		v2.POST("/downloadpem", controller.DownloadFile)

	}
	r.Run(":8888")
}

测试结果

在这里插入图片描述

带token的访问

在这里插入图片描述

过期的token

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值