当前位置: 首页 > article >正文

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

1.下载jwt

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

2.新建生成token和解析token文件

2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件
在这里插入图片描述

2.2 jwtconfig.go文件代码

/*
@Time : 2021/8/2 下午3:03
@Author : mrxuexi
@File : main
@Software: GoLand
*/
package jwtConfig
import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

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

const expire_time = 30 * time.Minute
var jwtSecret = []byte("123")
// 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
}


3.中间件封装文件

3.1 新建middleware文件夹和jwt.go文件
在这里插入图片描述

3.2 jwt.go文件代码

下图红色正方形框地址根据自己的项目定义
在这里插入图片描述

package middleware
import (
	"github.com/gin-gonic/gin"
	"ListProject-ver1.0/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
			}
		}
	}
}

4.调用测试中间件jwt功能

4.1 调用测试文件

在这里插入图片描述

4.2 代码

代码里面的ListProject-ver1.0/middleware这块也根据自己的项目引用

/*
@Time : 2021/8/2 下午3:03
@Author : mrxuexi
@File : main
@Software: GoLand
*/
package main
import (
    "github.com/gin-gonic/gin"
    "ListProject-ver1.0/middleware"
)

func main() {
    r := gin.Default()
    //注册组和中间件
    v1 := r.Group("/user")
    {
        v1.GET("/notoken",func(context *gin.Context) {
                            context.String(http.StatusOK, "hello gin post method")
                        })
    }
    //使用jwt中间件
    v2 := r.Group("/user2").Use(middleware.JWT())
    {

        v2.GET("/needtoken", func(context *gin.Context) {
                                   context.String(http.StatusOK, "hello gin post method")
                               })

    }
    r.Run(":8888")
}

4.3 调试结果

在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/403032.html

相关文章:

  • 青少年编程等级考试C++一级,硬币反转问题
  • 分层架构 IM 系统之架构演进
  • c++11的动态类型
  • VSCode快速生成vue组件模版
  • 高阶C语言补充:柔性数组
  • Linux: network: tcp: TCP: request_sock_TCP: Possible SYN flooding on port 3868.
  • 学习threejs,对模型多个动画切换展示
  • Matlab多输入单输出之倾斜手写数字识别
  • os库的常见使用
  • 星融元与焱融科技AI分布式存储软硬件完成兼容性互认证
  • 13.C++内存管理2(C++ new和delete的使用和原理详解,内存泄漏问题)
  • 数据结构(双向链表——c语言实现)
  • Restful API 规范详解
  • 单片机学习笔记 2. LED灯闪烁
  • c++--------《set 和 map》
  • C++手写PCD文件
  • 使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能
  • 前端页面自适应等比例缩放 Flexible+rem方案
  • 小程序-基于java+SpringBoot+Vue的超市购物系统设计与实现
  • 【React 进阶】掌握 React18 全部 Hooks
  • 鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
  • 详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)
  • Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射
  • EDA实验设计-led灯管动态显示;VHDL;Quartus编程
  • Ubuntu24.04LTS设置root用户可远程登录
  • Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行